www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega644 und 6-Kanal-PWM


Autor: Peter Gerblich (Firma: Jenaer Leiterplatten GmbH) (scorpius66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche verzweifelt einen 6-Kanal-LED-Dimmer mit einem ATmega644 zu 
programmieren, jedoch scheitert momentan alles am Timer0. An Timer2 
funktioniert alles und Timer1 habe ich, auf Grund der Problememit 
Timer0, noch nicht imlementiert.
Problem ist, OC0B wird nicht angesteuert. Wie gesagt, alle anderen 
Kanäle funktionieren wie sie sollen.
Wer kann mir zeitnah helfen, da es sich um ein eiliges Projekt handelt?
Die Adressbits benutze ich momentan zum Testen der PWM, hier hängt an 
den Pins ein DIL-Schalter, der später für die Adressvergabe des 
Bausteins in einem Bussystem diene soll. Jetzt gibt er mir Werte für die 
Compares vor.

Hier mal der betreffende Code-Auszug:
;------------------------------------------------------------------------------
main:
       ldi   r16,hi8(RAMEND)    ; Main program start
     out   ioSPH,r16      ; Set Stack Pointer to top of RAM
      ldi   r16,lo8(RAMEND)
      out   ioSPL,r16   
;----------------------------------------------------------
initIO:    push  r16
    ldi  r16,0b00011000
    out  DDRB,r16
    ldi  r16,0b11110000
    out  DDRD,r16
    ldi  r16,0b00000000
    out  DDRA,r16
    ldi  r16,0b11111111
    out  PORTA,r16
    pop  r16
;----------------------------------------------------------
initPWM:  push  r16
    ldi  r16,0b10100001    ; PWM Mode 1, Phase Correct PWM, Top 0xFF, Ch.A&B
    out  TCCR0A,r16
    ldi  r16,0b10100001
    sts  TCCR2A,r16
    ldi  r16,0b00000010    ; PWM Frequenz CLK/8
    out  TCCR0B,r16
    ldi  r16,0b00000010
    sts  TCCR2B,r16
    pop  r16
;------------------------------------------------------------------------------
mainloop:
        wdr
       in  r16,PINA    ; Adresse Bits 0-10 laden
    out  OCR0A,r16    ; und als CompareMatchA schreiben
    sts  OCR2A,r16
    out  OCR0B,r16    ; und als CompareMatchB schreiben
    sts  OCR2B,r16
    rjmp  mainloop
;------------------------------------------------------------------------------

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Spezifiziere bitte erst mal deinen ATMega644. Ist es ein ATMega644, 
644p, 644a oder 644pa?

MfG Spess

Autor: Peter Gerblich (Firma: Jenaer Leiterplatten GmbH) (scorpius66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

es ist ein ATMega644P-20PU, Takt wird über einen Quarz mit 3.6864MHz 
bereitgestellt.

Gruß Peter

Autor: Peter Gerblich (Firma: Jenaer Leiterplatten GmbH) (scorpius66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat evtl. jemand eine Idee?

Gruß Scorpius

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich habe dein Programm mal schnell getestet. Es funktioniert. Überprüfe 
mal deine Hardware.

MfG Spess

Autor: MWS (Gast)
Datum:
Angehängte Dateien:
  • PWM.hex (235 Bytes, 94 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal das Hex im Anhang, per AVR-Studio erzeugt. Ansonsten PB4 
toggeln, damit man sieht ob der auch tut.

Autor: Peter Gerblich (Firma: Jenaer Leiterplatten GmbH) (scorpius66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@MWS

was auch immer im HEX drinne steckt, es funktioniert. Mich würde nun 
interessieren, was hier programmiert wurde.

VG Scorpius

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Gerblich schrieb:
> was auch immer im HEX drinne steckt, es funktioniert. Mich würde nun 
interessieren, was
> hier programmiert wurde.

Nix anderes als im von Dir gezeigten Code, nur angepasst auf die Syntax 
des verwendeten C-Compilers, low/high statt lo8/hi8, SPL/SPH statt 
ioSPL/ioSPH, der Rest passte.

Evtl. der falsche Controller definiert ?

Autor: Peter Gerblich (Firma: Jenaer Leiterplatten GmbH) (scorpius66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die HEX-Datei analysiert und festgestellt, dass die 
Interuptvektoren fehlen. Habe mein Listing kurzer Hand angepasst, also 
ebenfalls die Int's weggelassen und siehe da, ich erhalte fast das 
gleiche Hex-Dump. Aber eben nur fast: 2 Byte Unterschied, und dass war 
der Knackpunkt. Für "out  OCR0B,r16 " erzeugt er mir "07 B9" Statt "08 
BD". Ich habe dann statt des Alias die Adresse von OCR0B (0x28) 
verwendet, und schon funktioniert auch der 2te Kanal von Timer0. Der 
Fehler liegt also eindeutig in der Linkdatei meiner Entwicklungsumgebung 
(SiSy-AVR). Testweise habe ich als Kontroller das 164er-Pendant des 
644er angegeben. Dort wird alles korrekt übersetzt. Hoffe nur, dass es 
der einzigste Fehler in der Link-Datei war, sonst wirds noch nen 
Späßchen geben mit der Programmiererei.
Ohne dem Hex-Dump von MWS hätte ich den Fehler nie herausgefunden, also 
vielen Dank nochmals an Alle, die mir bei der Fehlersuche geholfen 
haben.

VG Scorpius

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein 0xB907 ist ein OUT 0x07,R16, wird also in den korrekten Befehl mit 
dem richtigen Quellregister übersetzt, nur die Ziel-IO-Adresse stimmt 
nicht.

Überprüf' doch mal die .inc Datei für den ATM644P Deines Assemblers, da 
wird wahrscheinlich nur die falsche Adresse für OCR0B definiert sein. 
Bei der Gelegenheit würd' ich die 644er.inc gleich mit der .inc des 
ATM164 abgleichen, eben um weitere Überraschungen zu vermeiden.

Falls Dir das nicht bekannt ist: Du kannst selbst wenn AVR-Studio die 
.obj Deiner Entwicklungsumgebung nicht schluckt, doch immerhin das 
erzeugte Hex laden, auch simulieren.

Einfach in AVR-Studio auf Öffnen gehen und das Hexfile laden, dann 
siehst Du gleich wo's klemmt.

Autor: Peter Gerblich (Firma: Jenaer Leiterplatten GmbH) (scorpius66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Momentan benutze ich AVR-Studio noch nicht. Arbeite am momentanen 
Projekt mit Sisy-AVR. Ins AVR-Studio müsste ich mich erst einarbeiten 
und dafür ist im Moment zu kurzfristig, wegen Termin. Trotzdem Danke für 
Deine Hilfe.
Kann man mit AVR-Studio disassemblieren?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Gerblich schrieb:
> Kann man mit AVR-Studio disassemblieren?

Ja, klar, das war ja der Inhalt meiner Message.

Du kannst im laufenden Programm Variablen, Register und auch Befehle 
ändern.

Lädst Du ein Hex, dann öffnet nur das Disassemblerfenster.

Wenn eine .obj Datei geladen wird, siehst Du zuerst den Quellcode und 
kannst entweder ein Disassemblerfenster aufmachen (unter View oder per 
Icon), oder aber Rechtsklick auf die Codezeile und "Goto Disassembly".

Zumindest bei AVR GCC und bei Bascom ist das so, wie's bei SiSy ist kann 
ich nicht sagen, einfach ausprobieren.

Soviel einarbeiten ist das nicht, links Register, Mitte Quelltext oder 
Disassembler, rechts IO, so zumindest in der Standardeinstellung. Das 
hätte Dir viel mehr Zeit erspart, als Dich die Einarbeitung gekostet 
hätte.

Trifft übrigens für die AVR-Studio 4.. zu, nicht für die Beta 5, die 
find' ich eher kompliziert.

Peter Gerblich schrieb:
> Trotzdem Danke für
> Deine Hilfe.
Gerne.

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.