mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem beim AVR-Tutorial: PWM


Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
WorkPWM:
        ldi     temp, 0b11000000      ; 0 .. Led an, 1 .. Led aus

zu
WorkPWM:
        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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir keiner bei dem Problem helfen? )o:

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, ich muss jetzt arbeiten, ich werde morgen nachmittag wenn ich 
wieder zu hause bin alles hochladen. Danke

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Disassemblieren geht mit einem Disassembler
http://www.mikrocontroller.net/articles/Linksammlu...

Ich werde mir den Anhang heute abend in Ruhe ansehen.

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe beide deassmebliert und der einzige Unterschied den ich den 
finde ist im Header:

Ich habe ReAVR benutzt.


Orginal:
; reassembly of "LEDON.hex"
; created by ReAVR V3.2.0
; at 2008/03/14 - 17:08:55
; for Atmel AVR assembler
;---------------------------------------
; AVR_TYPE=<unknown>
; FLASH_SIZE=8KB
; SRAM_START=0x60
;---------------------------------------
  .cseg
  .org  0x0000
;---------------------------------------
; byte constants:
;
.equ  k00  = 0x00  ;
.equ  k01  = 0x01  ;
.equ  k02  = 0x02  ;
.equ  k04  = 0x04  ;
.equ  k08  = 0x08  ;
.equ  k0A  = 0x0A  ;
.equ  k10  = 0x10  ;
.equ  k14  = 0x14  ;
.equ  k20  = 0x20  ; ' '
.equ  k50  = 0x50  ; 'P'
.equ  k5F  = 0x5F  ; '_'
.equ  k7F  = 0x7F  ; ''
.equ  k80  = 0x80  ;
.equ  kC0  = 0xC0  ; 'À'
.equ  kFF  = 0xFF  ; 'ÿ'
;
; io register addresses:
;
.equ  p17  = 0x17
.equ  p18  = 0x18
.equ  p33  = 0x33
.equ  p39  = 0x39
.equ  p3D  = 0x3D
.equ  p3E  = 0x3E
;
; bit numbers:
;
.equ  b0  = 0x00
.equ  b1  = 0x01
.equ  b2  = 0x02
.equ  b3  = 0x03
.equ  b4  = 0x04
.equ  b5  = 0x05
.equ  b6  = 0x06
.equ  b7  = 0x07
; reassembly of "LEDON_read.hex"
; created by ReAVR V3.2.0
; at 2008/03/14 - 17:09:07
; for ICCAVR assembler
;---------------------------------------
; AVR_TYPE=<unknown>
; FLASH_SIZE=8KB
; SRAM_START=0x60
;---------------------------------------
  .area  text
;; older iccavr need different setup:
;;  .area  text (abs,ovr)
;;  .org  0x0000
;---------------------------------------
; byte constants:
;
k00  = 0x00  ;
k01  = 0x01  ;
k02  = 0x02  ;
k04  = 0x04  ;
k08  = 0x08  ;
k0A  = 0x0A  ;
k10  = 0x10  ;
k14  = 0x14  ;
k20  = 0x20  ; ' '
k50  = 0x50  ; 'P'
k5F  = 0x5F  ; '_'
k7F  = 0x7F  ; ''
k80  = 0x80  ;
kC0  = 0xC0  ; 'À'
kFF  = 0xFF  ; 'ÿ'
;
; io register addresses:
;
p17  = 0x17
p18  = 0x18
p33  = 0x33
p39  = 0x39
p3D  = 0x3D
p3E  = 0x3E
;
; bit numbers:
;
b0  = 0x00
b1  = 0x01
b2  = 0x02
b3  = 0x03
b4  = 0x04
b5  = 0x05
b6  = 0x06
b7  = 0x07

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist noch ein Bild wie mein Board gejumpert ist

http://www.plucked.de/IMG_0720.jpg

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Rainer H. (Firma: FHTW - Berlin) (plucked)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

http://img155.imageshack.us/my.php?image=031520081...

Hier noch das Foto vom Board, da kann man gut Erkennen was drauf steht.

http://www.plucked.de/IMG_0720.jpg

Deshalb hab ich das Programm auch mit folgender Include-Zeile 
kompiliert:
.include "m8515def.inc"

Diese sagt auch das der Timer0 Overflow bei dem Vektor 7 liegt
.
.
.
.equ  OVF0addr  = 0x0007  ; Timer/Counter0 Overflow
.
.
.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.