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
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
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
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.
kontrollier mal dene Jumpereinstellungen
ich hab schon Stunden Fehler im Code gesucht und am Ende war ein dummer
Jumper beim Pollin Board flsch gesteckt.
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.
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
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.
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.
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