Forum: Mikrocontroller und Digitale Elektronik Stromzähler S0 Schnittstelle auswerten


von Elias B. (bouni)


Lesenswert?

Hallo allerseits,

ich versuche verzweifelt einen Stromzähler mit S0-Schnittstelle 
auszuwerten.
Dieses Gerät ist im Einsatz:
http://www.bg-etech.de/index.php?option=com_content&view=article&id=57&Itemid=60
Ich versuche das ganze mit einem STK500 auszuwerten (nur zum Test).

Ich habe die wiki Seite dazu gelesen. leider schaff ich es nicht dem 
Zähler Impulse zu entlocken, bzw. diese zu erkennen.

Hier mein test Code
1
#ifndef F_CPU
2
#define F_CPU       16000000UL
3
#endif
4
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <inttypes.h>
8
#include <util/delay.h>
9
#include <stdlib.h>
10
11
int main(void){
12
13
    // LED's for debugging
14
    DDRC = 0xFF;
15
    PORTC = 0xFF;
16
17
    DDRA  = 0x00;  
18
    PORTA = 0xFF;     
19
20
    PCMSK0 |= (1<<PCINT0);
21
    PCICR |= (1<<PCIE0);
22
23
    // enable global Interrupts
24
    sei();
25
26
    // Endless while    
27
    while (1){
28
        _delay_ms(100);
29
        _delay_ms(100);
30
        _delay_ms(100);
31
        _delay_ms(100);
32
        _delay_ms(100);
33
        PORTC ^= (1<<PC7);
34
    }
35
return 0;
36
}
37
38
ISR(PCINT0_vect){
39
        PORTC ^= (1<<PC0);
40
}

Am PORTC sind die LED's vom STK500 angeschlossen.
An PA0 ist auf SO+ und GND auf SO- angeschlossen.
Siehe Bild zum S0 Schnittstellen Artikel, Interne Beschaltung 
http://www.mikrocontroller.net/articles/S0-Schnittstelle#Interne_Beschaltung

Wenn ich nur 2 Drähte an die Klemmen des Zählers anschließe und den 
Widerstand messe, dann sehe ich einen Widerstand von ca. 20MOhm, bei 
jedem Impuls bricht der Wert kurz ein. Da ich kein Oszi zu Hand habe 
kann ich leider nicht feststellen wie das ganze wirklich aussieht. Aber 
auf dem Zähler ist eine LED die bei jedem Impuls blinkt.

Wenn ich die STK Taster mit dem PORTA verbinde kommt der Interrupt wie 
er soll.

Nur mit dem Zähler dran passiert nix :/
Laut Webseite ist die Impulslänge 90ms. Das sollte doch noch mit dem 
Auge sichtbar sein!?

Wenn jemand Erfahrung mit diesem oder einem ähnlichen zähler hat wäre 
ich für jeden Tipp Dankbar!

Gruss Bouni

von Thorsten T. (Gast)


Lesenswert?

Warscheinlich blinken die LEDs im IR-Bereich. Ist bei unserem jedenfalls 
so.

von Elias B. (bouni)


Angehängte Dateien:

Lesenswert?

Hi Thorsten,

die LED am Zähler ist nur zum Optischen erkennen eines Impulses für den 
Betrachter.
Der S0 Ausgang ist im Prinzip (laut DIN 4????) ein Optokoppler der bis 
27V und max. 20mA kann.

Leider bekomm ich es nicht hin das mir eben dieser Optokoppler einen 
Eingang des STK500 schaltet :(

Im Anhang ist ein Bild wie ich das ganze angeschlossen hab.

Da die internen Pullups aktiviert sind muss ich ja extern nix mit 
Widerständen machen oder?

Die Leitugslänge von STK500 zum Zähler ist momentan ca. 2m (0.5mm²)

Ich hoff das mir jemand den Wink mit dem Zaunpfahl geben kann was ich 
falsch mache :/

Gruss Bouni

von Elias B. (bouni)


Lesenswert?

Keiner ne Idee?

von Hubert G. (hubertg)


Lesenswert?

Wenn du am S0 die Spannung misst, sollten es 5V sein.
Wird gezählt wenn du mit den Drähten die Pulse nachbildest?
Die Leitung schón mal umgedreht?

von cskulkw (Gast)


Lesenswert?

Hi Elias,

naja, es ist etwas ungeschickt, einen Portpin als ersatz für eine 
globale Variable zu mißbrauchen.

Löst Dein Interrupt überhaupt aus? Hast Du das einmal mit einem Taster 
an dem PIN ausprobiert? Das sollte am STK500 leicht möglich sein.

Hast Du den Eingang des Interruptportpins auf Eingangsfunktion gesetzt. 
Sprich ist das Bit für den Pin im DDR auf NULL gesetzt?

Sehr ungeschickt finde ich Deine Verzögerung vor dem Zurücksetzen. Kann 
gut sein, dass im Setztfall, deine Hauptschleife sofort die LED wieder 
zurücksetzt.

Sinnvoller wäre es eine if-Abfrage auf das Verändern des Portpin dafür 
zu benutzen, um dann die LED mittels Verzögerungen noch ein wenig 
leuchten zu lassen.

Aber viele Wege sollen ja nach Rom führen...

von ... (Gast)


Lesenswert?

Schau mal bei volkszaehler.org vorbei. Da sind auch Hardwarebeispiele 
für das auslesen eines S0-Ausganges vorhanden.

von ... (Gast)


Lesenswert?

Elias B. schrieb:
> Da die internen Pullups aktiviert sind muss ich ja extern nix mit
> Widerständen machen oder?

Die internen Pull-Ups liegen in der Größenordnung von ca. 10K.
Um störungsfreie Impulse zu bekommen solltest du vom Eingang gegen +5V 
einen 470 Ohm schalten. Ggf noch einen 0,1µF gegen GND.

von Simon K. (simon) Benutzerseite


Lesenswert?

1. Sowas schließt man nicht an einen Interrupt an. Erst Recht nicht mit 
2m Leitung dazwischen.
2. Ist der Interne Pullup zu hochohmig. Der fängt nur Störungen ein bei 
2m Leitung.

von Elias B. (bouni)


Lesenswert?

Hallo zusammen,

@cskulkw

>naja, es ist etwas ungeschickt, einen Portpin als ersatz für eine
>globale Variable zu mißbrauchen.

Das verstehe ich nicht?

>Löst Dein Interrupt überhaupt aus? Hast Du das einmal mit einem Taster
>an dem PIN ausprobiert? Das sollte am STK500 leicht möglich sein.

Jep, tut er. Mit den STK Tastern getestet :)

>Hast Du den Eingang des Interruptportpins auf Eingangsfunktion gesetzt.
>Sprich ist das Bit für den Pin im DDR auf NULL gesetzt?

Steht im Code den ich oben gepostet hab (DDRA  = 0x00;)

>Sehr ungeschickt finde ich Deine Verzögerung vor dem Zurücksetzen. Kann
>gut sein, dass im Setztfall, deine Hauptschleife sofort die LED wieder
>zurücksetzt.

Da setze ich aber nicht zurück sonder invertiere jede 500ms PC7 um eine 
mit 0.5Hz blinkende LED zu haben. Wollte damit sicherstellen das ich 
merke wenn der Interrupt ständig ausgelöst wird oder so.

Die LED die im Interrupt gesetzt (invertiert) wird ist an PC0.

>Sinnvoller wäre es eine if-Abfrage auf das Verändern des Portpin dafür
>zu benutzen, um dann die LED mittels Verzögerungen noch ein wenig
>leuchten zu lassen.

>Aber viele Wege sollen ja nach Rom führen...

Laut Webseite des Herstellers ist die Impulszeit 90ms. das sollte mit 
dem Menschlichen Auige zu sehen sein.

@Simon K.

> Sowas schließt man nicht an einen Interrupt an. Erst Recht nicht mit
> 2m Leitung dazwischen.

Ich neheme an das ich mir zu viele Störungen einfang oder? Sollte ich 
das ganze pollen!?

>2. Ist der Interne Pullup zu hochohmig. Der fängt nur Störungen ein bei
>2m Leitung.

Also mit einem Pullup von 470R wie von deinem Vorposter angegeben gegen 
5VDC?

Sollte ich die Leitungslänge verkürzen oder ist das egal?

Danke schon mal für die Antworten!!

Bouni

von Hubert G. (hubertg)


Lesenswert?

Der interne PullUp bei einem Mega16 ist, lt. Datenblatt, zwischen 20k 
und 50k.
Ein kleinerer ist daher sicher besser.
Hast du schon versucht dir Impulse beim Zähler nachzubilden, einfach mit 
einer Drahtbrücke.

von Bouni (Gast)


Lesenswert?

Hallo Hubert,

nein das hab ich noch nicht versucht. Ist aber ne gute Idee!
Ich werde berichten sobald Ich einen Test gemacht hab.

Gruss Bouni

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.