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


von Rainer H. (Firma: FHTW - Berlin) (plucked)


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

von Stefan B. (stefan) Benutzerseite


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?

von Rainer H. (Firma: FHTW - Berlin) (plucked)


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
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

von Stefan B. (stefan) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

von Rainer H. (Firma: FHTW - Berlin) (plucked)


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.

von Stefan B. (stefan) Benutzerseite


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).

von Rainer H. (Firma: FHTW - Berlin) (plucked)


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?

von Rainer H. (Firma: FHTW - Berlin) (plucked)


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

von Rainer H. (Firma: FHTW - Berlin) (plucked)


Lesenswert?

Kann mir keiner bei dem Problem helfen? )o:

von Stefan B. (stefan) Benutzerseite


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.

von Rainer H. (Firma: FHTW - Berlin) (plucked)


Lesenswert?

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

von Rainer H. (Firma: FHTW - Berlin) (plucked)


Angehängte Dateien:

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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Disassemblieren geht mit einem Disassembler
http://www.mikrocontroller.net/articles/Linksammlung#Disassembler

Ich werde mir den Anhang heute abend in Ruhe ansehen.

von Rainer H. (Firma: FHTW - Berlin) (plucked)


Lesenswert?

Ich habe beide deassmebliert und der einzige Unterschied den ich den 
finde ist im Header:

Ich habe ReAVR benutzt.


Orginal:
1
; reassembly of "LEDON.hex"
2
; created by ReAVR V3.2.0
3
; at 2008/03/14 - 17:08:55
4
; for Atmel AVR assembler
5
;---------------------------------------
6
; AVR_TYPE=<unknown>
7
; FLASH_SIZE=8KB
8
; SRAM_START=0x60
9
;---------------------------------------
10
  .cseg
11
  .org  0x0000
12
;---------------------------------------
13
; byte constants:
14
;
15
.equ  k00  = 0x00  ;
16
.equ  k01  = 0x01  ;
17
.equ  k02  = 0x02  ;
18
.equ  k04  = 0x04  ;
19
.equ  k08  = 0x08  ;
20
.equ  k0A  = 0x0A  ;
21
.equ  k10  = 0x10  ;
22
.equ  k14  = 0x14  ;
23
.equ  k20  = 0x20  ; ' '
24
.equ  k50  = 0x50  ; 'P'
25
.equ  k5F  = 0x5F  ; '_'
26
.equ  k7F  = 0x7F  ; ''
27
.equ  k80  = 0x80  ;
28
.equ  kC0  = 0xC0  ; 'À'
29
.equ  kFF  = 0xFF  ; 'ÿ'
30
;
31
; io register addresses:
32
;
33
.equ  p17  = 0x17
34
.equ  p18  = 0x18
35
.equ  p33  = 0x33
36
.equ  p39  = 0x39
37
.equ  p3D  = 0x3D
38
.equ  p3E  = 0x3E
39
;
40
; bit numbers:
41
;
42
.equ  b0  = 0x00
43
.equ  b1  = 0x01
44
.equ  b2  = 0x02
45
.equ  b3  = 0x03
46
.equ  b4  = 0x04
47
.equ  b5  = 0x05
48
.equ  b6  = 0x06
49
.equ  b7  = 0x07
1
; reassembly of "LEDON_read.hex"
2
; created by ReAVR V3.2.0
3
; at 2008/03/14 - 17:09:07
4
; for ICCAVR assembler
5
;---------------------------------------
6
; AVR_TYPE=<unknown>
7
; FLASH_SIZE=8KB
8
; SRAM_START=0x60
9
;---------------------------------------
10
  .area  text
11
;; older iccavr need different setup:
12
;;  .area  text (abs,ovr)
13
;;  .org  0x0000
14
;---------------------------------------
15
; byte constants:
16
;
17
k00  = 0x00  ;
18
k01  = 0x01  ;
19
k02  = 0x02  ;
20
k04  = 0x04  ;
21
k08  = 0x08  ;
22
k0A  = 0x0A  ;
23
k10  = 0x10  ;
24
k14  = 0x14  ;
25
k20  = 0x20  ; ' '
26
k50  = 0x50  ; 'P'
27
k5F  = 0x5F  ; '_'
28
k7F  = 0x7F  ; ''
29
k80  = 0x80  ;
30
kC0  = 0xC0  ; 'À'
31
kFF  = 0xFF  ; 'ÿ'
32
;
33
; io register addresses:
34
;
35
p17  = 0x17
36
p18  = 0x18
37
p33  = 0x33
38
p39  = 0x39
39
p3D  = 0x3D
40
p3E  = 0x3E
41
;
42
; bit numbers:
43
;
44
b0  = 0x00
45
b1  = 0x01
46
b2  = 0x02
47
b3  = 0x03
48
b4  = 0x04
49
b5  = 0x05
50
b6  = 0x06
51
b7  = 0x07

von Rainer H. (Firma: FHTW - Berlin) (plucked)


Lesenswert?

Hier ist noch ein Bild wie mein Board gejumpert ist

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

von Stefan B. (stefan) Benutzerseite


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).

von Rainer H. (Firma: FHTW - Berlin) (plucked)


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=03152008164603on0.jpg

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:
1
.include "m8515def.inc"

Diese sagt auch das der Timer0 Overflow bei dem Vektor 7 liegt
1
.
2
.
3
.
4
.equ  OVF0addr  = 0x0007  ; Timer/Counter0 Overflow
5
.
6
.
7
.

von Stefan B. (stefan) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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.

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
Noch kein Account? Hier anmelden.