Also bevor jetzt Sachen kommen wie "Verschwendung usw", ich habe
erstens nur einen ATmega16 und einen ATmega32 und es soll nur zum
testen und rumspielen sein. Da das Programm zur übung dient habe ich es
in Assembler geschrieben...
Ich habe ein Programm geschrieben das wie ein Buzzer für Spieler
funktionieren soll... Die Schaltung besteht aus einer Station
(Resettaster, uC, Summer und Spannungsquelle) und 3 "Buzzer" (Jeweils
1 Taster + 1 LED). Wird also der Resettaster gedrückt so ist alles
wieder aus, wird dann ein Buzzer (Taster) gedrückt so, so summt der
Summer 1-2 sec und danach leuchtet die LED beim Taster solange bis
wieder der Resettaster gedrückt wird...
Leider funtzt mein Programm nicht also es macht garnix... Es leuchtet
nix...
Hallo,
ich würde auch nicht leuchten... ;)
Mit
ldi Temp,00
out DDRB,Temp
setzt Du PortB auf Eingang.
Richtig wäre ldi Temp,$ff oder 255 oder 0b11111111
Weiter: das Du Port D nicht auf Eingang setzt, ist nur verzeihlich weil
der AVR nach dem Reset alles auf Eingang hat.
Ich kann Deine Schaltung leider so schlecht erkennen, muß mal Glaskugel
putzen gehen...
Aber: wenn Du die Taster wie üblich gegen Masse geschaltet hast, mußt
Du entweder externe PullUp-Widerstände dran habe oder Du mußt die
internen PullUps einschalte.
Also noch
ldi Temp, $FF
out PORTD, TEMP ; PullUps ein
ldi TEMP,0
out DDRD,TEMP ; Port D als Eingang.
Weiter:
sbis PIND,0x00
jmp BUZZ1
sbis erwartet als zweiten Parameter die Bitnummer, keine Bitmaske.
es sieht zumindest irreführend aus, wenn Du das hier so als Hex-Wert
schreibst. Die Bitnummern sind 0...7
Lesbarer wäre also sbis PIND,PD0 ; für Bit 0 an Port D
Die Bitnummerierung ist in den includes auch so bereits definiert.
Gruß aus Berlin
Michael
naja mein lauflicht hat funktioniert und ist ZIEMLICH ähnlich
aufgebaut... Siehe anhang
Was du mir jetzt da erklärt hast verstehe ich nicht ^^ aber ich werd es
mir nochmal in ruhe ansehen...
Hallo,
Lauflicht:
ser Temp ; alles auf 1
out DDRB,Temp ; Port B ist Ausgang
Buzzer:
ldi Temp,00 ; alles auf 0 <-
out DDRB,Temp ; Port B ist Eingang <-
Der Rest waren mehr Hinweise zur Lesbarkeit des Codes.
Wenn Du in einem halben Jahr in Deinen Code schaust, wirst Du es
vermutlich besser verstehen. :)
Gruß aus Berlin
Michael
also ich habe jetzt so einiges verändert was du mir gesagt hast jedoch
funktioniert es noch immer nicht, also jetzt sind zu beginn alle LED's
am Board an (Also würde in der Schaltung der Summer vollepulle summen),
wenn ich dann resettaster drücke assiert erstmal nix ... drücke ich
dann einen buzzer so erlicht ene LED... drücke ich dann einen anderen
buzzer passiert nix... nachdem ich dann den resettaster gedrückt habe
kann ich wieder mit einem buzzer eine LED erlichen jedoch erlicht
nichteinmal die LED die zum Buzzer gehört und dabei soll keine LED
erlichen sondern eine LED leuchten und alle anderen sollen aus sein ...
Hallo,
.include "m16def.inc"
.def Temp =r16
.def Delay1 =r17
.def Delay2 =r18
.def Delay3 =r19
RESET:
ser Temp ; alles auf 1
out DDRB,Temp ; PortB auf Ausgang
; da hängen Deine LED dran? Gegen GND oder gegen Ub?
;------------------
;BUZZER ABFRAGE
;------------------
START:
sbis PIND,PD0 ; skip, wenn PD0 auf 1
; Vermutung auch hier: Taster gegen GND, ok
jmp BUZZ1 ; nehmen wir an, der ist gedrückt, also PD0 ist 0
sbis PIND,PD1
jmp BUZZ2
sbis PIND,PD2
jmp BUZZ3
rjmp START
;------------------
;BUZZER 1 GEDRUECKT
;------------------
BUZZ1: ; dann landen wir hier
ldi Temp,8
out PORTB,Temp Bit 7 auf 1, wohl die Hupe? Gegen GND oder gegen
Ub?
; vermute gegen GND, sonst könnte sie mit PD7 auf High nicht hupen...
DLY1:
dec Delay1 ; etwas warten
brne DLY1
LED1:
ldi Temp,1 ; jetzt also PD0 auf 1
; wenn die LED gegen Ub hängt, geht sie jetzt aus!
out PORTB,Temp
xxx:
sbis PIND,PD3 ; ist PD3 0?
jmp RESET ; ja, Taster gedrückt, also Reset
rjmp LED1 ; wieder nach oben, ist relativ sinnlos, weil PD0
ist ja schon 1, würde ein Sprung nach xxx reichen
Rest mal gelöscht um Platz zu sparen.
Du siehst, ohne Deinen Schaltplan kann ich nur raten, was passieren
könnte, weil ich nicht weiß, wie die LEDs angeschlossen sind...
Ich habe übrigens mal in Dein Lauflicht reingeschaut: ich nehme mal an,
es hat immer eine LED geleuchtet und diese wurde rechts bzw. links lang
geschoben?
Wenn das so ist, kann ich Dir versichern, daß Du nicht weißt, warum das
überhaupt funktioniert hat. ;-)
Gruß aus Berlin
Michael
zeig uns doch mal deine beschaltung.
außerdem setzten sich die eingänge nicht automatisch zurück wenn du
folgendes machst:
sbis PIND,PD3
jmp RESET
da würde ich noch ein
ldi Temp,0
out PORTB,Temp
in den reset einbauen.
außerdem brauchst du für das delay keine 3 register, weil immer nur ein
delay gleichzeitig läuft, wenn ich das richtig verstanden habe.
außerdem musst du in das Delay-Register auch erst mal was reinladen
bevor du es runterzählst und mit 0 vergleichst. des weiteren muss es
die der Port beim reset zurück gesetzt werden!
ja das ist so also eine led hat geleuchtet und wurde geschoben... warum
sollte das denn nicht so funktionieren??
einen schaltplan habe ich nicht aber die leds und die hupe werden alle
samt gegen masse geschlossen also er taster kommt an ub und gibt die
spannung weiter wenn gedrückt, die led kommt zwichen uC und masse und
soll so geschaltet werden die hupe auch, testen kann ich das alles nur
auf meinem stk500 weil ich die schaltung für die buzzeranlage noch
nicht aufgebaut habe... Auf dem stk500 soll:
Taster 0: BUZZER 1
Taster 1: BUZZER 2
Taster 2: BUZZER 3
Taster 3: RESET
LED 0: BUZZER 1
LED 1: BUZZER 2
LED 2: BUZZER 3
LED 3: HUPE
Wie gesagt das ganze soll wie bei einer fernsehsendung funktionieren:
Bei Taster 0,1,2 soll jeweils die Hupe 1-2 sec hupen und danach soll
die passende LED leuchten is Taster 3 gedrückt wird.
Hallo,
@Ludwig Wagner:
er geht an mehreren Stellen davon aus, daß bestimmte Zustände und
Registerinhalte "so sind, wie sie sind". ;)
Darauf wollte ich ihn möglichst stoßen, daß er das erkennt.
Wenn Du in sein Lauflicht schaust (und ich keine Tomaten auf den Augen
habe), wirst Du vermutlich sehen, welche Voraussetzung ihm da geholfen
hat.
Wenn man 0b11111111 in ein Register lädt und ausgibt, kann man es
eigentlich stundenlang im Kreis schieben und es bleiben lauter Einsen.
Nur weil .... geht es.
Vielleicht weiß er das aber auch und ich irre mich.
Was die Fehler angeht: die habe ich genauso gemacht, ist nur länger her
als es Atmels gibt und im Internet fragen konnte ich mangels desselben
auch nicht.
Ich will ihn auch in keiner Weise ärgern, aber etwas nachdenken hat
noch nie geschadet. :)
Gruß aus Berlin
Michael
Wenn man 0b11111111 in ein Register lädt und ausgibt,
<-- was genau ist das für ein wert??
Und dass mein lauflicht funktioniert ist weil ich das programm aus
mehereren anderen programmen zusammen gesetzt habe, auch das delay ding
habe ich aus einem anderen programm und ich habe ehrlich gesagt kA was
da passiert... Deswegen wende ich mich ja an euch weil bisjetzt alles
so geklappt hat und jetzt geht nix mehr ...
ich schätze dieser wert bedeuetet binär 11111111 also alles an jedoch
weiss ich es nicht weil ich assembler eigentlich nur vom midicom kenne
da schreibt man einfach 1111b , 0Fh oder 16 deswegen kommt mir diese
0b11111111 sehr kurios vor ...
>> aber alles fertig hinklatschen will ichs auch ned, sonst lernt mans
nie...
da hast du wohl recht aber wenn du mir genau sagen könntest wo der
fehler iegt würde es mir mehr helfen als wenn ich jetzt stundenlang auf
einen code schaue der in meinen augen korrekt ist ... ;)
Hallo,
hat sich gerade ünerschnitten, Dein Posting.
Also: Taster an Ub und gibt die Spannung weiter...
wenn das so ist:
sbis PIND,PD1 ; Überspringe den nächsten Befehl, wenn das Bit
gesetzt, also auf 1, High ist
jmp BUZZ2 -> hierlang also, wenn das Bit 0, Low ist, das
widerspricht Deiner Beschreibung ,daß der Taster Ub durchschaltet, dann
müßte der gedrückte Taster High, also 1 erzeugen, und der Spring zu
BUZZ2 würde NICHT stattfinden.
Der Taster dürfte also, wie es üblich ist zwischen Pin und Masse
liegen...
Dazu kommt gleich eine Frage: das AVR-Pin ist Eingang, der Taster ist
nicht gedrückt, also offen.
Was hat der Eingang dann für einen Pegel? Er hängt ja dann in der Luft
und ist nirgens angeschlossen.
LED: Du schreibst eine 1 in den Port und eine LED geht aus (zumindest
nach Deiner letzten Beschreibung).
Eine 1 heißt ja, der Port schaltet gegen Ub. Wenn die LED gegen Masse
liegen würde, müßte sie aber angehen.
Gegen Ub hätte sie dann an beiden Enden Ub und damit 0V Differenz zum
leuchten...
Ich kenne das STK500 nicht, ich habe nur das alte STK200 hier.
Da liegen LEDs und Taster gegen Masse.
Das sollte aber in der Beschreibung Deines STK500 drinstehen.
Ich bin also vorerst etwas verwirrt. :)
Zum Lauflicht:
LEDL: ; Du springst hier zum ersten mal rein
out PORTB,Temp ; welchen Wert enthält Temp hier?
rol Temp ; und welchen Wert enthält Temp jetzt?
:-)
Gruß aus Berlin
Michael
Hallo,
der Assembler ist ja nur ein Übersetzungswerkzeug.
Die Syntax legt der Hersteller desselben halt fest.
Der AVR-Assembler von Atmel kennt
0b11100011 für Binär
0x0F oder $0F für Hex (er nimmt beides)
123 für Dezimal
012 für Oktal (mit führender Null!)
letzteres ist eine böse Falle, wenn man zur besseren Lesbarkeit zum
Beispiel folgendes schreibt:
.db 122 ; kommen alles 3-Stellige Dezimalzahlen!!!
.db 546
.db 012 ; weil es so schöner aussieht
.db 008
Gibt beim vorletzten einen falschen Wert und beim letzten eine
Fehlermeldung.
Gruß aus Berlin
Michael
boah voll kompliziert ... lass ieber mal das lauflicht weg das funtzt...
also laut beschreibung:
LED leuchtet wenn 1 am ausgang des uC's
Wenn taster NICHT gedrückt --> 1 am eingang des uC's
Ich jedoch möchte dass meine LED leuchtet wenn 1 am ausgang
und 1 am eingang wenn taster gedrückt ... (so soll es später in der
schaltung aussehen)
hat dein eingang einen externen pulldown? sonst können evtl. leitungen
schöne antennen sein und weitere fehler hervorrufen.
Wie schaltest du eig. den summer und die LED's? Hoffentlich doch über
transistoren, oder?
darüber wollte ich mir gedanken machen wenn mein programm funktioniert
... Aber ich glaube transistoren wären ne gute lösung... Welcher
eingang meinst du?? ich habe wie gesagt noch keine schaltung gbaut...
als eingang meine ich die eingänge an denen die taster angeschlossen
sind. Aber du hast recht, erst mal sollte dein programm funktionieren
(wozu aber pulldowns aber auch beitragen könnten...)
wie ist denn jetzt im moment der stand deines codes? ich blicke hier
langsam nimmer durch mit dem lauflicht ect.
Bleiben wir doch alle erst mal HIER beim buzzer... also am besten
nochmal den code posten, wie er im moment ist, dann kann ich dir auch
beispiele geben wo du was verbessern musst...
Hallo,
ok, also LED gegen Masse und Taster gegen Masse.
Taster gegen Masse ist üblich.
Warum?
Ganz einfach: wenn der Taster nicht gedrückt ist, muß ja trotzdem ein
sinnvolles Potential am PIN des AVR liegen. Das wird mit einem
Widerstand gegen den anderen Spannungspol gemacht.
Am Verbindungspunkt Taster-Widerstand liegt der AVR-Eingang.
1. Variante: +Ub - Widerstand - Taster - Masse
wenn der Taster offen ist, hat der AVR über den Widerstand
High-Potential, also liest eine 1
wenn der Taster geschlossen wird, hat er über den Taster Low-Potential,
liest also eine 0
Der Widerstand verhindert einen Kurzschluß beim Drücken und sorgt
dafür, daß der Pin bei offenen Taster ein eindeutiges Potential hat.
2.Variante: +Ub - Taster - Widerstand -Masse
wenn der Taster offen ist, hat der AVR über den Widerstand
Low-Potential, also liest eine 0
wenn der Taster geschlossen wird, hat er über den Taster
High-Potential, liest also eine 1
Das wäre die Version, die Du willst.
Kannst Du machen.
Macht man selten, weil der AVR interne Widerstände zwischen Pin und Ub
hat, die man einschalten kann (Datenblatt, I/O-Beschreibung).
Die 1. Variante spart also unter Umständen etliche Widerstände ein,
deshalb wird meist diese benutzt.
Letztlich ist es im Programm ja nur der Unterschied zwischen
sbis Port,Bit
und
sbic Port,Bit
ob ich bei 0 oder bei 1 springe...
Zu dem, was Ludwig Wagner schrieb:
Du verläßt Dich an mehreren Stellen darauf, das irgendwas bestimmtes in
einem Register oder Port drinsteht.
Um nach dem Start alle LEDs auszubekommen, muß im PortD alles auf 0
sein.
Das schreibst Du aber beim Initialisieren Deines Programms nirgends
rein, Du hoffst nur, daß es so ist.
Wenn Du in Deinem Programm irgendwann nach Reset springst, ist im PortD
aber das gespeichert, was Du zuletzt reingeschrieben hast und das ist
durchaus nicht 0.
Gruß aus Berlin
Michael
ich könnte dir das programm jetzt natürlich in 2 minuten richtig
schreiben, wenn du das willst, aber ich glaube da währe dir nicht
worklich geholfen.
Ich würde dir empfehlen erst mal das tutorial komplett mehrere male
durchzulesen oder sogar abzuarbeiten.
da steht eigentlich schon fast alles zu eingängen und ausgängen ect.
drinn was du hier wissen musst.
http://www.mikrocontroller.net/tutorial/
Wenn du mir verrätst wie die schaltung im moment aufbaut ist kann ich
dir ja mal ne .hex geben die du programmierst, dann sehen wir ob es
überhaupt funktioniert.
wenn ja dann können wir uns den korrekten Code zusammen erarbeiten,
denn du sollst nicht nen code reinschreiben und fertig, sondern ihn
auch verstehen.
wenn du willst auch über ICQ, geht dann denk ich schneller zum
erklähren!
jo also das mit dem tutorial ist so ne sache... ich habe es bereits
mehrere malen durchgelesen aber ich verstehe vieles nicht und glaube
dass ich am meisten lerne wnn ich das was ich haben möchte ans laufen
bekommen weil ich dann weiss ie es geht und es immer wieder so benutzen
kann aber einen text lesen den ich nicht verstehe wird mir wohl nicht
soderlich helfen... das mit ICQ ist ne gute idee.. meine nummer ist:
315-712-977 ich kann dich gerne heute noch annehmen aber ich würde den
"unterricht" lieber auf morgen verschieben weil heute eht nix mehr in
meinen kopf...
kk alles klar ... ich habe auch recht wenig zeit weil ich im
abschlussjahr bin für den techniker in der kommunikations elektronik
... deswegen auch das atmel zeugs. Ich muss für mein projekt Atmel in
assembler programmieren können und damit dann eine blackbox
programmieren die wir in einer gruppe zusammen bauen... Aber erstmal
wäre es gut wenn ich "einfache" sachen hinkriegen ;)