Forum: Mikrocontroller und Digitale Elektronik BCD-8421 mit atmega8


von Vic (Gast)


Lesenswert?

Hallo,

ich bin ein Neuling in Sachen AVR programmierung. Wollte mir die Basics 
beibringen und dazu mit dem Pollin "Atmel Evaluations-Boars V2.0.1 und 
Atmel Addon Board V1.0" vier LED's im BCD-8421 Code zum leuchten 
bringen. Über zwei Taster soll inkrementiert bzw. dekrementiert werden.
Allerdings funktioniert es nicht ganz, nach einschalten des uc leuchten 
die vier LED's gleich und die Taster haben keine Funktion. Mir scheint 
es als ob die "sbic" befehle ignoriert werden und er gleich zu "plus" 
springt und das Register erhöht.
Kann mir vielleicht jemand Helfen?

Hier mein Programm soweit:

.include "m8def.inc"

    ldi r16, 0b00001111
    out DDRD, r16
    ldi r16, 0b11110000
    out PORTD, r16

    ldi r16, 0b00000000
    out DDRB, r16
    ldi r16, 0b11111111
    out PORTB, r16

    ldi r16, 0b00000000

abfrage:  sbic PINB, 0
    rjmp plus

    sbic PINB, 1
    rjmp minus

    rjmp abfrage

plus:          inc r16
    out PORTD, r16
    rjmp abfrage

minus:          dec r16
    out PORTD, r16
    rjmp abfrage

von Michael U. (amiga)


Lesenswert?

Hallo,

war es bei den Pollin-Boards nicht so, daß die Taster gegen + schalten 
und extern PullDown-Widerstände haben?
Aber das hast Du ja sicher im Schaltplan nachgesehen.

Gruß aus Berlin
Michael

von Vic (Gast)


Lesenswert?

Hallo Michael,

ja bei den Pollin Boards ist es so das die Taster gegen Vcc schalten und 
ein 60KOhm PullDown Widerstand haben.

von Reinhard R. (reirawb)


Lesenswert?

Ich kenne das Pollin-Board nicht, aber ich vermute, dass am Port B die 
Taster hängen.
Wenn diese -wie Du schreibst- an Vcc mit 60 kOhm Pulldown hängen, Du 
aber die internen Pullupwiderstände -die lt. DB 20 bis 50 kOhm haben- 
aktiviert hast, lesen die Tasteneingänge immer "1". Und da die Taste 
"Plus" zuerst abgefragt wird, wird r16 ständig incrementiert. Das geht 
so schnell, das Du an allen LED-Ausgängen eine PWM mit 50% Aktivzeit 
hast, die die LEDs gleichmäßig leuchten lassen.
Häng mal (so vorhanden) ein Oszi an die LED-Ausgänge, dann siehst Du es.

Änderungsvorschlag:
>    ldi r16, 0b11111111   ;Pullup aktiv
>    out PORTB, r16

ändern in:
    ldi r16, 0b00000000   ;Pullup deaktiviert
    out PORTB, r16

Reinhard

von Vic (Gast)


Lesenswert?

Hallo Reinhard,
danke für deinen Vorschlag. Bin mir jetzt nicht mehr ganz sicher, aber 
ich glaube ich habe es, so wie du beschrieben hast, schon mal probiert 
gehabt. Weil ich mir sowas schon gedacht habe. Aber zur Sicherheit 
probiere ich es heute Abend, wenn ich zuhause bin, noch einmal aus.

von Vic (Gast)


Lesenswert?

Leider hat die Änderung nichts gebracht, nach einschalten leuchten die 
vier LED's an PortD sofort.

von gast (Gast)


Lesenswert?

kontrollier mal dene Jumpereinstellungen
ich hab schon Stunden Fehler im Code gesucht und am Ende war ein dummer 
Jumper beim Pollin Board flsch gesteckt.

von Vic (Gast)


Lesenswert?

Mhhh eigentlich müssten die Jumper stimmen. Bei dem Pollin Board sind 
die Ports auf einen 40pol Stecker gelegt. Über diesen Stecker dann auf 
das Addonboard mit den LED's und Taster. Auf diesem Addonboard wird dann 
alles über Kabel verbunden. Habe die vier LED's an Port D 0..3 und die 
zwei Taster an Port B 0..1. Es sind übrigens 33KOhm Pulldown 
Widerstände, nicht wie erst von mir behauptet 60KOhm.

von Reinhard R. (reirawb)


Lesenswert?

Du solltest mal festzustellen, was an den LED-Ausgängen anliegt. Du 
schreibst, die LEDs leuchten. Hast Du Zugriff auf ein Oszilloskop? Dann 
kontrolliere damit die Ausgänge für die LEDs, ob diese permanent Ein 
sind oder ob dort ein Rechtecksignal anliegt. Den Unterschied siehst 
-ohne Vergleich- optisch nicht.
Eine Möglichkeit das ohne Oszi festzustellen, wäre, eine der LEDs 
permanent einzuschalten. Mit dem Befehl
    sbi PortD,3
gleich nach der jeweiligen Portausgabe setzt Du eine LED auf Ein. Also:

plus:          inc r16
    out PORTD, r16
    sbi PortD,3
    rjmp abfrage

minus:          dec r16
    out PORTD, r16
    sbi PortD,3
    rjmp abfrage

Leuchtet diese LED jetzt heller, ist das ein Indiz dafür, das Du ein 
Rechteck an den anderen Ausgängen hast, bei gleicher Helligkeit scheint 
permanent Ein zu herrschen.

Miß mal die Spannung an den Eingangspins der Taster, die Du benutzt, 
einmal mit losgelassenem und einmal mit gedrücktem Taster und poste die 
Ergebnisse hier. Miß aber direkt am Prozessorpin, so siehst Du was da 
wirklich ankommt.

Du kannst auch versuchen, die Pulldownwiderstände von dem Board zu 
verkleinern, z.B. auf 1 bis 5 kOhm. Vielleicht nur mal provisorisch für 
die benutzten Taster. Mehr als ein etwas erhöhter Stromverbrauch bei 
gedrückten Tastern passiert da nicht. Aber die Eingangspegel werden 
sicherer.

Viel Erfolg.

Reinhard

von Vic (Gast)


Lesenswert?

Also irgendwie ist das ganz komisch. Taster 1 funktioniert einwandfrei. 
Nicht gedrückt = 0V, gedrückt = 5V. Taster 2 allerdings ist bei nicht 
gedrückt = 2.7V und bei gedrückt = 5V. Beim AVR ist es aber anders. Am 
Pin PB0 ist immer 5V, Taster drücken oder nicht macht keinen 
Unterschied. Am Pin PB1 ist immer 0V, egal ob Taster gedrückt oder 
nicht.

von Vic (Gast)


Lesenswert?

Wenn ich das Kabel ziehe das an den Taster 2 geht, funktioniert der 
Taster auch einwandfrei. Auf dem Kabel sind allerdings 5V.
Wenn ich die Taster nicht angeschlossen habe liegt an Pin PB0 5V und an 
PB1 0V.

von Reinhard R. (reirawb)


Lesenswert?

Was Du am Pin direkt mißt, das "sieht" auch der Prozessor. Deshalb 
solltest Du zuerst mal die Verdrahtung kontrollieren und Fehler 
beseitigen, bis Du an beiden Taster-Pins die richtigen Spannungen messen 
kannst, also bei Taster nicht gedrückt Nähe 0V und bei Taster gedrückt 
sollte dei Betriebsspannung zu messen sein. Solange das noch nicht 
klappt, kann das Programm auch nicht richtig laufen.

Reinhard

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.