Forum: Mikrocontroller und Digitale Elektronik Starthilfe für Anfänger ATmega8


von Ralf B. (genlittle)


Lesenswert?

Hallo zusammen und herzlichen Gruß aus Rhede.
Ich hatte in den Vergangenen Tagen das Glück, das mir jemand seine 
Arbeit mit dem ATmega8 zeigte. Ich fand dies sehr interessant und habe 
mir überlegt, mich auch mit der Thematik zu beschäftigen.

Alle (hoffentlich) notwendigen Teile habe ich mir besorgt.
Dies wären:
1 x Pollin Board V2.01
2 x ATmega8
2 x ATmega16
-----------------------------------

Der Proz. war relativ leicht aufgesattelt.
Die serielle Verbindung auch hergestellt und die ersten Progs 
"abgeschrieben", assembliert und mittels avrdude eingefräst.

Soweit so gut und alles lief mehr oder weniger ohne Fehlermeldungen 
durch. Die Meldungen die kamen, konnte ich selber auf Seite schaffen.
nach langem hin und her, Testen, Lesen, "versuchen" zu verstehen ... 
etc. habe ich eine (scheinbar) unüberwindliche Hürde.

Es sieht für mich so aus, als wolle der ATmega8 nicht anfangen wollen zu 
arbeiten.

Hier mal ein quelltext des Assembler-Progs:
1
/*
2
 * ledblink.asm
3
 *
4
 *  Created: 13.12.2011 16:07:45
5
 *   Author: R.Blicker
6
 */ 
7
 .include "m8def.inc"
8
 .org 0
9
 ldi r16,0xFF   ; Hier soll der Wert 255 in das Reg r16 geladen werden
10
 out DDRB,r16   ; PORTB wird zum Ausgang gemacht
11
 out PORTB,r16  ; Schreibe r16 auf PORTB
12
 ldi r16,0x00   ; Lade den Wert 000 in das Reg r16
13
 out DDRB,r16   ; Setze wiederum PORTB als Ausgang
14
 out PORTB,r16  ; Schreibe r16 auf PORTB

Das vom Compiler erzeugte Hexfile sieht so aus:
1
:020000020000FC
2
3
:040000000FEF08BB3B
4
5
:00000001FF

Mittels avrdude habe ich das Hexfile eingeladen:

Ausgabe von avrdude:
1
rblicker@e6510:~$ avrdude -p ATmega8 -cponyser -P /dev/ttyS0 -U flash:w:./Temp/ledblink.hex 
2
3
avrdude: AVR device initialized and ready to accept instructions
4
5
Reading | ################################################## | 100% 0.00s
6
7
avrdude: Device signature = 0x1e9307
8
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
9
         To disable this feature, specify the -D option.
10
avrdude: erasing chip
11
avrdude: reading input file "./Temp/ledblink.hex"
12
avrdude: input file ./Temp/ledblink.hex auto detected as Intel Hex
13
avrdude: writing flash (4 bytes):
14
15
Writing | ################################################## | 100% 0.01s
16
17
avrdude: 4 bytes of flash written
18
avrdude: verifying flash memory against ./Temp/ledblink.hex:
19
avrdude: load data flash data from input file ./Temp/ledblink.hex:
20
avrdude: input file ./Temp/ledblink.hex auto detected as Intel Hex
21
avrdude: input file ./Temp/ledblink.hex contains 4 bytes
22
avrdude: reading on-chip flash data:
23
24
Reading | ################################################## | 100% 0.00s
25
26
avrdude: verifying ...
27
avrdude: 4 bytes of flash verified
28
29
avrdude: safemode: Fuses OK
30
31
avrdude done.  Thank you.

Als der ATmega8 nichts getan hatte, habe ich die Standard-Fuses geprüft.
Hier wiederrum die Ausgabe von avrdude:
1
rblicker@e6510:~$ avrdude -p ATmega8 -cponyser -P /dev/ttyS0 -v
2
3
avrdude: Version 5.10, compiled on Jun 27 2010 at 00:38:29
4
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
5
         Copyright (c) 2007-2009 Joerg Wunsch
6
7
         System wide configuration file is "/etc/avrdude.conf"
8
         User configuration file is "/home/rblicker/.avrduderc"
9
         User configuration file does not exist or is not a regular file, skipping
10
11
         Using Port                    : /dev/ttyS0
12
         Using Programmer              : ponyser
13
         AVR Part                      : ATMEGA8
14
         Chip Erase delay              : 10000 us
15
         PAGEL                         : PD7
16
         BS2                           : PC2
17
         RESET disposition             : dedicated
18
         RETRY pulse                   : SCK
19
         serial program mode           : yes
20
         parallel program mode         : yes
21
         Timeout                       : 200
22
         StabDelay                     : 100
23
         CmdexeDelay                   : 25
24
         SyncLoops                     : 32
25
         ByteDelay                     : 0
26
         PollIndex                     : 3
27
         PollValue                     : 0x53
28
         Memory Detail                 :
29
30
                                  Block Poll               Page                       Polled
31
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
32
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
33
           eeprom         4    20   128    0 no        512    4      0  9000  9000 0xff 0xff
34
           flash         33    10    64    0 yes      8192   64    128  4500  4500 0xff 0x00
35
           lfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
36
           hfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
37
           lock           0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
38
           calibration    0     0     0    0 no          4    0      0     0     0 0x00 0x00
39
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
40
41
         Programmer Type : SERBB
42
         Description     : design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts
43
44
avrdude: AVR device initialized and ready to accept instructions
45
46
Reading | ################################################## | 100% 0.00s
47
48
avrdude: Device signature = 0x1e9307
49
avrdude: safemode: lfuse reads as E1
50
avrdude: safemode: hfuse reads as D9
51
52
avrdude: safemode: lfuse reads as E1
53
avrdude: safemode: hfuse reads as D9
54
avrdude: safemode: Fuses OK
55
56
avrdude done.  Thank you.

Ich hätte mindestens erwartet, das die LED aufgrund der 1Mhz 
Taktfrequenz augenscheinlich an bleibt. Aber selbst das ist nicht der 
Fall.

Bin ich zu doof, habe ich an den falschen Stellen gesucht, Passt soweit 
alles oder nichts? Ich habe mittlerweile keine Ideen mehr.

Vielleicht sieht ja einer von den Profis etwas.
Danke für die bereitschaft der Unterstützung.

von Tom M. (tomm) Benutzerseite


Lesenswert?

Ralf Blicker schrieb:
> avrdude: writing flash (4 bytes):

Nur 4 Bytes? Dein übersetztes Programm sollte grösser sein. Ich vermute, 
da ist was beim Assemblieren schief gelaufen.

Lösch mal die hex und übersetze dein Programm nochmals.

von Ingo D. (ingo2011)


Lesenswert?

.. warum an bleibt ?
Nachdem Du sie einschaltest, schaltest Du sie (die LED) auch gleich 
wieder aus.
Mach da mal ein Delay von ein paar Millisekunden (100-500) rein, dann 
wird die LED auch blinken
Gruss Ingo

von Krapao (Gast)


Lesenswert?

Lies sich ins AVR-Tutorial ein. Es gibt auch Artikel zu Pollin 
Boards in der Artikelsammlung.

Hast du mal den Schaltplan deines Pollin Boards betrachtet, ob die LEDs 
auch an PORTB angeschlossen sind und die Jumper auf dem Board 
entsprechen gesetzt sind? Ich meine, wenn das nicht der Fall ist, kann 
dein Programm die LEDs einfach nicht zum Leuchten bringen!

Dein Programm läuft bei 1 MHz Taktfrequenz des AVR geschätzt ca. 6-10 
Millionstel Sekunden. Die Einschaltzeit der LED beträgt ca. 2 
Millionstel Sekunden (angenommen EIN ist HIGH auf PORTB und AUS ist LOW 
auf PORTB, d.h. active-high geschaltete LED). Das menschliche Auge ist 
nicht leistungsfähig genug, um das zu sehen, schätze ich.

Dein Programm sollte am Ende nicht so einfach ins Nirvana abtauchen. Ein 
ordentliches µC Programm arbeitet in einer Endlosschleife.

von Lukas (Gast)


Lesenswert?

Das Led wird für einige Takte angehen und dann wider aus, je nach dem, 
wie du die LED angeschlossen hast. Das Programm wird ja nicht 
automatisch wiederholt. Könnte es daran liegen?

lg

von Ralf B. (genlittle)


Lesenswert?

Krapao schrieb:
> Lies sich ins AVR-Tutorial ein. Es gibt auch Artikel zu Pollin
> Boards in der Artikelsammlung.
>
> Hast du mal den Schaltplan deines Pollin Boards betrachtet, ob die LEDs
> auch an PORTB angeschlossen sind und die Jumper auf dem Board
> entsprechen gesetzt sind? Ich meine, wenn das nicht der Fall ist, kann
> dein Programm die LEDs einfach nicht zum Leuchten bringen!
>
> Dein Programm läuft bei 1 MHz Taktfrequenz des AVR geschätzt ca. 6-10
> Millionstel Sekunden. Die Einschaltzeit der LED beträgt ca. 2
> Millionstel Sekunden (angenommen EIN ist HIGH auf PORTB und AUS ist LOW
> auf PORTB, d.h. active-high geschaltete LED). Das menschliche Auge ist
> nicht leistungsfähig genug, um das zu sehen, schätze ich.
>
> Dein Programm sollte am Ende nicht so einfach ins Nirvana abtauchen. Ein
> ordentliches µC Programm arbeitet in einer Endlosschleife.

Hallo Krapao,

DANKE, das war's.

Hier mal meine korrigierte Variante:
1
 * AVRAssembler1.asm
2
 *
3
 *  Created: 13.12.2011 22:41:53
4
 *   Author: R.Blicker
5
 */ 
6
.include "m8def.inc"
7
.org 0
8
9
LOOP:
10
  ldi r16,0xFF   ; Hier soll der Wert 255 in das Reg r16 geladen werden
11
  out DDRD,r16   ; PORTB wird zum Ausgang gemacht
12
  out PORTD,r16  ; Schreibe r16 auf PORTB
13
  ldi r16,0x00   ; Lade den Wert 000 in das Reg r16
14
  out DDRD,r16   ; Setze wiederum PORTB als Ausgang
15
  out PORTD,r16  ; Schreibe r16 auf PORTB
16
  rjmp LOOP

H

von Ralf B. (genlittle)


Lesenswert?

Herzlichen Dank an die Jungs für die flotten Antworten...

von Cyblord -. (cyblord)


Lesenswert?

Ralf Blicker schrieb:

>
1
> /*
2
>  * ledblink.asm
3
>  *
4
>  *  Created: 13.12.2011 16:07:45
5
>  *   Author: R.Blicker
6
>  */
7
>  .include "m8def.inc"
8
>  .org 0
9
>  ldi r16,0xFF   ; Hier soll der Wert 255 in das Reg r16 geladen werden
10
>  out DDRB,r16   ; PORTB wird zum Ausgang gemacht
11
>  out PORTB,r16  ; Schreibe r16 auf PORTB
12
>  ldi r16,0x00   ; Lade den Wert 000 in das Reg r16
13
>  out DDRB,r16   ; Setze wiederum PORTB als Ausgang
14
15
>  out PORTB,r16  ; Schreibe r16 auf PORTB
16
>

Die Kommentare stimmen nicht.

>  ldi r16,0x00   ; Lade den Wert 000 in das Reg r16
>  out DDRB,r16   ; Setze wiederum PORTB als Ausgang

setzt die Portrichtung wieder auf Eingang!

Warum machst du das? Die Portrichtung sollte einmal VOR der Schleife auf 
Ausgang gesetzt werden, danach wird der Port nur noch ein und 
ausgeschaltet, die Richtung aber nicht mehr verändert.

gruß cyblord

von oldmax (Gast)


Lesenswert?

Hi
Schau dir wirklich mal die Tutorials an. Ich hab auch mit dem Board 
angefangen und durch studieren der Tutorials eigentlich (fast) alles 
gelernt, was gebraucht wird. Da ich das Problem, "was macht der 
Controller eigentlich" kenne, habe ich hier ein kleines Progtrramm 
veröffentlicht, welches dir zur Laufzeit über die serielle Schnittstelle 
die Variableninhalte in den PC schreibt. So kannst du sehen, ob die von 
dir vorgesehenen Schritte bearbeitet und die Werte in den VAriablen wie 
erwartet sind. Such mal nach OpenEye. Weitere Hilfe findest du auch im 
Forum von AVR-Praxis.
Ach ja, das Board wird richtig gut, wenn du dir einen USB-ISP-Stick 
zulegst. Dann ist der Umweg über PonyProg oder ähnliche Programme 
Geschichte und du kannst direkt aus AVR-Studio mit einer ordentlichen 
Geschwindigkeit deine Programme übertragen.
Gruß oldmax

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.