Stromzähler S0 Schnittstelle auswerten

OP #2298888
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
OP #2299131
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
Angehängte Dateien:
Gast #2299444
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...
Gast #2299504
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.
OP #2299624
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren