Hi, also ich habe den Auftrag ein Lauflich zu Programmieren auf einem ATmega8. Ich habe 2 Lichtmodis mir ausgedacht und wollte diese jeweils durch einen schalter von einander trennen. Ich habe das Programm soweit geschrieben, allerdings läuft es nicht auf meinem mikrocontroller. Könnte bitte einer mal ein Auge auf das Programm werfen und mir sagen was ich verbessern muss. Bin am verzweifeln -.- Code: ;*************************************; ;*Programm: Knight Rider Lauflicht RL*; ;*************************************; ;*Autor: Heller Tobias *; ;*Datum: 16.02.2006 *; ;*Letzte Änderung: 16.02.2006 *; ;*Version: 1.0 *; ;*************************************; .include "m8def.inc" ldi r16, 0xff ;Port D wird als Eingang deklariert out DDRD, r16 ldi r16, 0x00 out ddrb, r16 ldi r19,LOW(RAMEND) ;Initailsierung für Unterprogramme out SPL, r19 ldi r19,HIGH(RAMEND) out SPH, r19 start: rjmp schalter Funky: rcall FunkyTown ;Hier steht die Procedure zu dem Lauflichtmodus KnightRider KnightRider: ldi r16, 0b10000000 ;Die LED Nr.1 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b01000000 ;Die LED Nr.2 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00100000 ;Die LED Nr.3 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00010000 ;Die LED Nr.4 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00001000 ;Die LED Nr.5 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00000100 ;Die LED Nr.6 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00000010 ;Die LED Nr.7 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00000001 ;Die LED Nr.8 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00000001 ;Die LED Nr.8 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00000010 ;Die LED Nr.7 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00000100 ;Die LED Nr.6 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00001000 ;Die LED Nr.5 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00010000 ;Die LED Nr.4 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b00100000 ;Die LED Nr.3 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b01000000 ;Die LED Nr.2 leuchtet out PORTD, r16 rcall Warteschleife ldi r16, 0b10000000 ;Die LED Nr.1 leuchtet out PORTD, r16 rjmp start ;Hier steht die Procedure zu dem Lauflichtmodus "Funky Town" Funkytown: ldi r16, 0b00011000 ;Die LED Nr.1 leuchtet out PORTd, r16 rcall Warteschleife ldi r16, 0b00100100 ;Die LED Nr.2 leuchtet out PORTd, r16 rcall Warteschleife ldi r16, 0b01000010 ;Die LED Nr.3 leuchtet out PORTd, r16 rcall Warteschleife ldi r16, 0b10000001 ;Die LED Nr.4 leuchtet out PORTd, r16 rcall Warteschleife ldi r16, 0b01000010 ;Die LED Nr.5 leuchtet out PORTd, r16 rcall Warteschleife ldi r16, 0b00100100 ;Die LED Nr.6 leuchtet out PORTd, r16 rcall Warteschleife ldi r16, 0b00011000 ;Die LED Nr.7 leuchtet out PORTd, r16 rjmp start ;Procedur für DIE Warteschleife Warteschleife: loop2: ldi r17,0x01 ldi r18,0x01 loop1: dec r18 brne loop1 dec r17 brne loop2 ret Schalter: in r20, portb sbis portb, 1 rjmp KnightRider rjmp Funkytown ich weiß, dass das Programm sehr simpel und umständlich geschrieben ist, also bitte keine Kommentare von wegen "was bistn du fürn Depp" oder so ^^ schonmal danke im vorraus. mfg Tobi
Was meinst Du denn mit "läuft nicht"? Kannst Du eine einzelen LED zum blinken bringen? Hast Du schon irgendein Programm auf diesem Controller zum laufen gebracht? Welchen Oszillator benutzt Du? Sind die Fuses korrekt programmiert?
ahhhh ma ganz langsam ^^ also habe ein programm vom freund draufgehabt da hat alles wunderbar funktioniert. im simulator funktioniert es, allerdings nicht afu dem board. was für einen ozilator ... einen quarz mit 4, 0000 MHZ Was sind Fuses wenn ich fragen darf? mfg Tobi
Hallo Tobi... Deine Warteschleife ist so kurz, damit du nie ein Lauflicht sehen kannst. Deine Pause dauert 6 Takte bei 4 MhZ. Besser wären da 2 Millionen Takte als Pause, dann hast du alle 0,5 Sekunden ein Lauflichtwechsel. Es gibt doch diesen AVR Delay Generator, der könnte für dich sehr nützlich sein. Gruß Florian
Hi Flo, danke für deine antwort. habe die schleife normalerweise auf 0xFF stehen. 0x01 ist nur zum testen, weil man dann bei step to step sieht ob es funkst. ist dieser delay generator beim normalen AVR studio dabei? und wie bekomme ich das mit dem schalter geregelt? habe den schalter jetzt mit einem 10k ohm vorwiederstand an den controller und an masse angeschlossen an PB1 Danke im vorraus. mfg Tobi
Wegen dem Delay Generator schaue mal hier: http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html Ein Schalter gehört normalerweise mit einem Pin zum µC un mit dem anderen direkt auf Masse. Die 10 KOhm gehören dann einmal zum µC und einmal auf 5v. Somit ist der Eingang immer auf +5V und sobald du drückst auf Masse. Gruß Florian
also im moment ist der so: PB1 -> 10 kohm -> schalter -> masse ist das jetzt falsch? :o und ist die programmierung von der Procedur Schalter falsch? danke für die seite mfg Tobi
Ach ja... wo ichs gerade so seh: http://www.mikrocontroller.net/tutorial/io-basics <-- da stehs und du must den Taster entprellen
> ldi r16, 0xff ;Port D wird als Eingang deklariert > out DDRD, r16 > > ldi r16, 0x00 > out ddrb, r16 Du Deklarierst PORTD als Ausgang und PORTB als Eingang. Überprüf am besten mal, ob das so stimmt. Ansonsten solltest du lieber Timer für dein Lauflicht verwenden. Sieht besser aus und du sparst dir die Schleifen. Dann kannst du auch das Timing leichter verändern.
Delays: Grund-Delay ca. 0.64msec:
1 | .equ Speed=32 ; 8 = 1MHz; 16 = 2MHz; 32 = 4MHz; 64 = 8MHz; |
2 | ;128 = 16MHz; 160 = 20MHz |
3 | |
4 | DELAY: |
5 | push R16 ;Warteschleife |
6 | ldi R16, Speed ;Anzahl Durchläufe, siehe ganz oben |
7 | DELAY_AGAIN: |
8 | dec R16 ;Durchläufe -1 |
9 | nop ;Bremse |
10 | nop
|
11 | nop
|
12 | tst R16 |
13 | brne DELAY_AGAIN ;Abgelaufen? Dann raus |
14 | pop R16 |
15 | ret
|
Zweite Stufe 100msec:
1 | Delay100:
|
2 | push R16 |
3 | ldi R16,100 |
4 | Delay100_A: |
5 | rcall Delay |
6 | dec R16 |
7 | cpi R16, 0 |
8 | brne Delay100_A |
9 | pop R16 |
10 | ret
|
Dritte Stufe 500msec:
1 | Delay500:
|
2 | push R16 |
3 | ldi R16,10 |
4 | Delay500_A: |
5 | rcall Delay100 |
6 | dec R16 |
7 | cpi R16, 0 |
8 | brne Delay500_A |
9 | pop R16 |
10 | ret
|
So, damit hast du gleich drei universelle Delays Speed entsprechend setzen, dann stimmen die angegebenen Zeiten. Schalterabfrage ist ok, der Schalter wird direkt zwischen Controllerpin und Masse gelegt, der 10kOhm-Widerstand kommt direkt zwischen Controllerpin und 5Volt. Gruss Jadeclaw.
man kann am AVR eingangspin auch den internen pullup anschalten (im Port register eine 1 schreiben) dann sparst du dir den widerstand ganz
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.