Seite 1 von 1

[ gelöst ] s0 Zähler via Optokopller

Verfasst: 21.12.2012, 11:09:17
von somebuddy
Guten Tag,

Ich würde gerne via 4 Optokoppler entsprechend 4 S0 Signal einfangen und entsprechend darstellen.

Es scheitert allerdings schon am Impulse zählen.

Die 4 Optokoppler habe ich folgendermaßen aufgebaut :
Unbenannt.JPG
Verwendet habe ich die in Ulrichs Reichelt Liste vorgeschlagenen PC847.

Wenn ich nun den Diodenstrom bei meiner Testschaltung messe, komme ich auf ca. 30mA.
Ist das zuviel ?

Werde aus dem Datenblatt nicht ganz schlau.
Sind die 100% CTR bei 5mA automatisch auch der max Wert ?
Habe ich mit den 30mA eventuell schon die Diode im OK zerstört ?

Vielen Dank für eure Hilfe.

Grüße

Re: s0 Zähler via Optokopller

Verfasst: 21.12.2012, 11:31:34
von somebuddy
wenn ich die ausgänge kurzschließe.. also 12V ( nicht 24 wie im schaltplan ) an der OK Diode anstehen ist PA0 nicht auf 3,3V.

Aber auch wenn ich händisch 3,3V auf PA0 lege funktioniert meine Zählroutine nicht , wobei das wohl ein anderes Problem ist.

Wird PA0 irgendwo im Webmodule Beispielprogramm beeinflusst ?

DDRA habe ich auf 0x00 gesetzt und USE_ADC auf 0.

Re: s0 Zähler via Optokopller

Verfasst: 21.12.2012, 11:39:13
von somebuddy
Anbei noch die Zählfunktion ( angelehnt an Beispiel aus dem Forum ) ..

Usart Ausgaben in ISR sind ein nogo.. ich weiß. Ist lediglich zu debug Zwecken.
Wenn ich mir komplett PORTA ausgeben lasse gibt er mir DEZ 64 zurück.
Wenn ich Maskiere wie in meinem Beispiel dann 0.

Lege ich manuell 3,3V an PA0 bleibt es bei 0.

DDRA = 0 wie gehabt.


Code: Alles auswählen


/*
 * s0.c
 *
 * Created: 20.12.2012 23:51:33
 *  Author: Dennis
 */ 

#include <stdint.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h> 


#include "config.h"
#include "usart.h"
#include <stdlib.h>


#include "s0.h"

volatile uint16_t wattstunden1 = 0;  // Zähler bis 1000 Wattstunden
volatile uint16_t kilowattstunden1 = 0; //Zähler bis 65535 kWh

 uint8_t Muster = 0; 
uint8_t Merke = 0; 
 uint8_t patt = 0; 
uint8_t Testbit = 0; 

void s0init()
{
	
TCCR2B |= (1<<WGM22) | (1<<CS20 | 0<<CS21 | 1<<CS22);
TCNT2 = 0;
TIMSK2 |= (1 << OCIE2A);	
usart_write("s0Init");
}




//Timer Interrupt

ISR (TIMER2_COMPA_vect)
{
	if ( Testbit == 0)
	{
	usart_write("%d",PORTA & (1<<PINA0));	
	}
	
	//usart_write("%d",Testbit);
	Testbit++;                                                    // zählt die Einsprünge .. Unwichtig.
	Merke = PORTA & (1<<PINA0);                                     // PortA Auslesen (Bit 1,2,3)
	//if (Merke!=Muster)                                           // Abkürzen wenn sich nichts getan hat.
	//{
		patt  = Merke&~Muster;                                     // patt !=0 -> Ein oder mehrere Pins springen auf High.
		
	if(patt)
	{
		uint16_t Tausend = 1000;   // Register mit 1000 laden für mehrere Vergleiche

		if(patt & 1)
		{
			wattstunden1++;
			usart_write("%d Wattstunden 1",wattstunden1);
			if(wattstunden1 > Tausend)
			{
				kilowattstunden1++;
				wattstunden1 -= Tausend;
			}
		}
	}
	
   Muster=Merke;                                            // neues Muster merken!
   
}



Edit :

PA0 ist wie bei dem Original WebModule direkt am PortPin des AVR.

Wenn ich nun mit dem Multimeter ( ohne OK ) direkt die Spannung am PA0 Messe. Messe ich 0,0V. Diese Spannung steigt langsam an und ist bei ca. 10 Sekunden bei 1,2 V und fällt danach wieder ab.

Gut.. es ist natürlich ohne Zusatzboard auch kein PullDown Widerstand installiert. Aber das ist doch kein typisches "Schwingen" oder ?

Re: [ gelöst ] s0 Zähler via Optokopller

Verfasst: 22.12.2012, 13:53:22
von somebuddy
Muss schon sagen .. dieses Forum bietet Hilfe zur Selbsthilfe.. :)

Nach ewigem Suchen , bin ich nun dem Fehler auf die Schliche gekommen.
Möchte euch natürlich daran teilhaben lassen.

"Man sieht den Wald vor lauter Bäumen nicht.."

Zunächst die Funktion des Optokopplers:

Ich habe blauäugig zviel des Layouts von Ulrich für meine Platine übernommen.
Im Schaltplan zwar augenscheinlich richtig , sah es im Layout "leider" etwas anders aus ;)
Unbenannt2.JPG
Für Ulrichs Beispiel / Schaltplan natürlich völlig korrekt und sicher auch gewollt, war es für meine an S0 angepasst Schaltung natürlich "tödlich" wenn die OK Eingänge direkt auf Masse gezogen werden.
Nach dem auftrennen der mit Rot markierten Verbindungen funktionierten die Optokopller einwandfrei.

Dennoch würde mich noch interessieren ob ein Strom von 30mA auf Dauer zuviel ist.


Die Zählfunktion:

Ich habe den Status eines Pins auf folgende Art und Weise abgefragt:

Code: Alles auswählen

usart_write("%d",PORTA & (1<<PINA0));	
das ist natürlich falsch !

es muss folgendermaßen abgefragt werden :

Code: Alles auswählen

usart_write("%d",PINA & (1<<PINA0));	
Nun wird auch ordentlich gezählt.

Soviel dazu ! :)

Re: [ gelöst ] s0 Zähler via Optokopller

Verfasst: 22.12.2012, 17:55:25
von Ulrich
Sorry,

mein Fehler habe ich gerade korrigiert.

Seit über 1Jahr liefere ich eine korrigierte Version aus ohne diesen Fehler. Habe nur die HP nicht aktualisiert gehabt.

:-) Guß
Uli