mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA8515, PWM-Beispiel aus dem Wiki funktioniert nicht?


Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum!

Ich habe jetzt gut 3 Stunden im Forum verbracht und trotz x ähnlicher 
Themen immer noch keine Lösung für mein Problem gefunden.

Umgebung: AVR Studio 4.12, STK500 mit ATMEGA8515L

Ich wollte das Software-PWM-Beispiel (Assembler) im Wiki 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM) probieren 
und scheitere immer wieder daran.

Anstelle der im Wiki beschriebenen m8def.inc include ich die für diesen 
Prozessor nötige m8515def.inc.

Problem: Die LED's des STK500 leuchten immer auf "volle Kraft". Auch mit 
"externen" LEDs dasselbe Spiel.

Ist der Prozessor für dieses Beispiel zu schnell?
Vielleicht irgendwas an den Fuse-Bits? (Nur geraten, habe ich irgendwo 
hier aufgeschnappt.)

Ich danke Euch für Eure Geduld und Hilfe.

Vorweihnachtliche Grüße,
Mathias

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

Bewertung
0 lesenswert
nicht lesenswert
Wohl eher irgendwelche Steuerbits  bei den Timern, die
beim Mega8515 in anderen Registern untergebracht sind.

Da hilft nur eines: Datenblat raus und nachsehen ob
beim Mega8515 die benötigten Bits auch in denselben
Registern untergebracht sind (und eventuell mit
dem Datenblatt des Mega8 vergleichen, ob sie auch
dasselbe bewirken)

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wirf das Programm mal im Simulator an, ob dir das Aufschluss über die 
Ursache gibt.

Breakpoints in die Timer-Routinen, etc.

LEDs am richtigen Port?

Vielleicht habe ich heute Abend Zeit das mal zu testen... jetzt aber 
erstmal Weihnachtsmarkt!

Gruß

Kai

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Mathias
schau mal hier nach ist nur ein beispiel
www.mikrocontroller.net/topic/18808#postform
vielleicht hifts ein wenig weiter

mfg
kay

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...gut, ich bin nicht doof aber ich versteh' Bahnhof.

Klar, war lesen kann ist klar im Vorteil aber dafür verstehe ich die 
Materie nicht mal gut genau um zu wissen, woran ich erkenne, wonach ich 
suche.

Vielleicht irgendjemand hier, der dasselbe Problem hat(te)?

Ich hab hier noch nen ATMEGA16, mal gucken, was der sagt...

Danke erstmal, Karl-Heinz

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Kai, hallo Kay ;)

Die Leds sind am richtigen Port.
Leider hilft mir der Simulator nicht wirklich weiter.

Den Link lese ich mir heute Abend mal durch und gebe nochmal 
Rückmeldung.

Danke erstmal.

Autor: Buschwindröschen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi     temp, 0b00000010      ; TOIE0: Interrupt bei Timer Overflow

dann klappt's auch mit dem 8515er...

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich ganz einfach:

- Stell mal den Simulator auf ATmega8515
- Cursor auf "main:"
- "Run to Cursor" Strg+F10

zu dem Zeitpunkt hat der schon alle Einstellungen gemacht

Klapp mal TIMER_COUNTER_1/TCCR1A und TIMER_COUNTER_1/TCCR1B in der 
I/O-View auf. Zudem PORTA bis PORTD. Man erkennt z.B., dass PINB1 als 
Ausgang definiert wurde.

Wir mogeln jetzt etwas:
- Schalt mal CS12 aus und dafür CS10 ein.

Das beschleunigt den Timer um Faktor 256, was das Debugging um eben die 
selbe Zeit verkürzt ;)

Wenn du jetzt den Autostep-Modus (Alt+F5) startest, dann siehst du, dass 
der Timer losrennt. Während wir jetzt gespannt darauf warten, dass PINB1 
auf High gesetzt wird passiert was anderes: PIND5 geht auf High!

Ein flüchtiger Blick ins Datenblatt sagt auch warum: auf dem ATmega8 ist 
OC1 = PB1 (wie im Wiki-Code angegeben), auf dem ATmega8515(L) allerdings 
ist OC1 = PD5!
Ändere den unteren Teil einfach wie folgt ab:
    ; Den Pin OC1A zu guter letzt noch auf Ausgang schalten
    ldi      temp1, 1 << PORTD5 ; Die Notation ist lesbarer,  0b00100000 ist auch gut.
    out      DDRD, temp1
und schließ die LEDs an Port D an.

Leider funktioniert das dann in der Simulation immer noch nicht richtig, 
obwohl es das meiner Meinung nach sollte:
;     WGM13    WGM12   WGM11    WGM10
;      1        1       1        0

Eigentlich sollte der Counter (TCNT1) bis ICR1H laufen... er läuft aber 
nur bis OCR1A ... was nur bei WGM10 = 1 passieren sollte (Seite 121, 
Tabelle 53). Setze ich im Simulator das Bit, so zählt er höher (0x3FFF), 
aber auch nicht bis ICR1.

Vielleicht kann das jemand anderes erklären, ich habe mit den meisten 
PWM-Modi noch nichts gemacht. Müsste ich selber nachlesen.

Hoffe, das hilft dir weiter

Gruß

Kai

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Argh! Kleines Detail überlesen... sorry!

Na ja... wenn du den anderen Code auf deinem Controller ausführen 
willst, geht das jetzt auch ;)

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und vielen, vielen Dank für die Hilfe.
Ich hatte zwar mit dem zweiten Programm probiert aber es geht ja ums 
Prinzip an sich. Ich selbst hätte mich im Datenblatt wundgelesen. ;)

Ich probiere am WE nochmal mit dem 8515 und gebe Feedback. Nochmals 
danke für die schnelle Hilfe.

Gruß,
Mathias

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.