Hi,
ich bin gerade bei dem Tutorial hier angelangt
http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM
und irgendwie klappt das nicht wie es soll. Ich wollte gerne den unteren
Code auf meinen STK500 raufspielen und testen. Aber wenn ich das
Programm überspiele leuchten einfach alle LEDs über PORTB. Muss ich noch
was beachten vorher?
lg
Dass alle LED leuchten ist eigentlich richtig. Sie sollten allerdings
unterschiedlich hell leuchten.
Vielleicht werden die alle "am Anschlag" betrieben und man sieht mit dem
Auge keine Helligkeitsunterschiede.
Hast du Daten, welche LEDs du verwendest ("normale"? Low-Current?
Datenblatt?) und welchen Vorwiderstand du benutzt?
Ich benutze die LEDs auf dem STK500, weiß nicht genau was das für welche
sind. Aber ich glaube eher das das Problem nicht bei den LEDs liegt
sondern beim Timer. Weil hab den Code so verändert das eigentlich nur 6
der 8 LEDs leuchten dürften. Und zwar habe ich die Zeile modifiziert
1
WorkPWM:
2
ldi temp, 0b11000000 ; 0 .. Led an, 1 .. Led aus
zu
1
WorkPWM:
2
ldi temp, 0b00000000 ; 0 .. Led an, 1 .. Led aus
Aber es war keine Veränderung zu sehen. Muss man den Timer irgendwie
noch Aktivieren oder so? Also außer im Code.
Achso, ich benutze einen Mega8 µC
Die LED auf dem Board sind alle aktiv low, d.h. wo bei
0b11000000
eine 0 steht ist eine LED an und wo eine 1 steht ist sie aus. Hier sind
LED 0 bis 5 an und 6 und 7 aus. Deine Änderung schaltet LED 6 und 7 mit
voller Beleuchtungsstärke dazu.
Hast du das AVR Studio und kannst du den Code dort simulieren? Ich
könnte mir das erst heute abend anschauen.
Der Grund für diese seltsame Initialisierung ist, dass der Mega8
am PortB nur 6 herausgeführte Leitungen hat (wenn ein Quarz
drann ist). Der Zustand von PB6 und PB7 sollte aber keinen
Einfluss auf die restlichen Pins haben.
> Muss man den Timer irgendwie> noch Aktivieren oder so? Also außer im Code.
Nein, eigentlich nicht.
Wenn du das Programm fehlerfrei in den Prozessor übertragen
kannst, die LED mit dem richtigen Port verbunden sind und
der Prozessor grundsätzlich läuft, dann müsste das eigentlich
funktionieren.
Im Simulator macht das Beispielprogramm genau das was es soll.
Zum übertragen bin ich auf Tools->Programm AVR->Conntect gegangen
Hab mich verbunden, bin dann auf den Reiter Program gangen, hab bei
Flash die hex-datei ausgewählt und auf Program geklickt.
Bei nem einfachen Programm wo ich einfach mal bestimmte LEDs so
eingeschaltet habe ging das auch wie gewollt. Nur halt bei dem Beispiel
sind alle LEDs an.
Alle LEDs an (0 bis 5 im Original vor deiner Änderung) ist ja richtig.
Wie gesagt, sollte es Unterschiede in der Helligkeit geben.
Das eigentliche Flackern/Blinken mit hundertundeinpaarzerquetschten
Herzen sieht man wegen der Trägheit des Auges nicht.
Du könntest aber hingehen und das Flackern provozieren, indem du den
Prescaler hochsetzt, d.h. die Timer Overflows langsamer ausgelöst
werden. Also statt
ldi temp, 0b00000001 ; CS00 setzen: Teiler 1
eine anderen grösseren Prescaler z.B. 256 und dann neben dem Spielfilm
laufen lassen und ab und zu draufschielen, ob sich die LED ändern.
ldi temp, 0b00000100 ; CS02 setzen: Teiler 256
Bei deinen Versuchen mit bestimmten LED - war das auch an PORTB und
hattest du auch mal was erfolgreich mit genau dem Atmega8 Exemplar und 4
Mhz gemacht (um die Fuses Einstellung abzuklopfen).
Sorry für meine späte Antwort.
Also ich hab deine Änderung ausprobiert und mal mit dem Auge drauf
geschielt, aber ich konnte da nichts sehen. Ich hab das Tutorial so
verstanden das eigentlich die ersten 6 LEDs eine unterschiedliche
"Helligkeit" haben müssten.
Gibt es bestimmte Einstellungen die ich vornehmen muss bei den Fuses?
Vielleicht mach ich beim bespielen was falsch:
Also ich kompiliere die Anwendung und suche die .hex datei und lade sie
in den Flash. Muss ich was anderes machen?
Ich hab gestern nochmal getestet und ich kann zu 100% sagen das der
Timer nicht geht. Ich weiß nicht wieso, weil im Simulator geht das ja
alles. Ich hab sogar mal die Definition auf 8515 gesetzt, aber nichts.
Wie kann der Timer denn deaktiviert sein?
Ich hab an dem Testboard keine Änderungen vorgenommen, nur den PortB mit
den LEDS und den PortD mit den Schaltern verbunden
Lies mal aus, was an Programm im Atmega8 drin ist und hänge das HEX-File
hier an. Das wird dann disassembliert und mit dem Originalcode
verglichen.
Und wenn du dabei bist, lies auch die Fuses aus und gib das Ergbenis
hier an.
Ich habe jetzt die .hex datei raufgespielt und dann gelesen. In der
Zip-Datei im Anhang zu diesen Post befindet sich die ledon.hex, welche
von avr studio direkt kommt und die ledon_read.hex, welche ausgelesen
ist.
Wie kann ich die jetzt deassemblieren?
Der zu flashende und der ausgelesene Code sind beide nicht für einen
Atmega8 geschrieben. Der Timer0 Overflow Vektor sollte beim Atmega8 der
Vektor 9 sein, tatsächlich ist es aber der Vektor 7. Dadurch kann die
Interruptroutine nicht aufgerufen werden, selbst wenn sie korrekt
initialisiert wäre.
Der Fehler kann (wird) davon kommen, dass im Assembler (AVR Studio) der
falsche Mikrocontroller eingestellt ist und/oder das falsche Includefile
verwendet wird, d.h. ein Fehler in der Source vorhanden ist. Vektor 7
haben u.a. die At...8515.
Bitte kontrolliere die Einstellungen in AVR Studio, deinen Quellcode und
ggf. das Includefile selbst (letzteres ist eine eher unwahrscheinliche
Fehlerquelle bei einem so altgedienten µC wie dem Atmega8).
Rainer H. wrote:
> Die Sache ist ja das ich Annehme einen atmega8515 zuhaben. Zumindest> steht das auf dem µC und laut AVR Studio erkennt er ihn auch als> solches:
Tja, dann habe ich vergeblich Zeit reingesteckt, weil ich die ganze Zeit
von diesem Posting ausgegangen bin:
> Autor: Rainer H. (Firma FHTW - Berlin) (plucked)> Datum: 06.03.2008 15:43> ...> Achso, ich benutze einen Mega8 µC
Und kein Aufschrei gekommen ist, als ich dich bat
> Autor: Stefan "stefb" B. (stefan) Benutzerseite> Datum: 11.03.2008 11:26>> Lies mal aus, was an Programm im Atmega8 drin ist und hänge das> HEX-File hier an.
Der gesetzte Jumper BSEL2 auf deinem STK500 ist zu prüfen.
Laut Doku hat der mit der HV-Programmierung zu tun und sollte ausserhalb
der HV-Programmierung offen sein.
Bei der HV Programmierung laufen über PB0-7 die Daten - vielleicht
liegen diese Leitungen bei gejumpertem BSEL2 am HV-Programmer gegen GND
und lassen so die LEDs leuchten.