Ich möchte mit meinem Attiny44A eine Sinuswelle ausgeben. Hierfür habe
ich eine 8-Bit Lookuptabelle in meinem Code eingefügt.
Die Ausgabe erfolgt per PWM-Signal, welches analog in eine Sinus-Welle
konvertiert wird.
Die Eingabe erfolgt über einen Zähler (i) der durch die Sinustabelle
durchläft. Wenn der Zähler bis 255 läuft entsteht ein unerklärlicher
Pick (siehe Bild) in der Welle kurz vor derm Erreichen der
Spitzenspannung. Stelle ich die Obergrenze des Zählers auf 240 oder
kleiner passiert dies nicht. Ich kann mir das nicht erklären. Hat
zufällig jemand eine Idee.
Wenn ich mir das PWM-Singal anschaue springt es beim Erreichen des
höchsten Wertes ein paar ms wild hin und her.
Marius D. schrieb:> PWM(0x00);
Upps - was ist das denn?
> SREG |= BIT7; //sei(); // ebable interrupts
Auch sehr kreativ, aber nimm ruhig sei(), das läuft auch dann, wenn das
I-Bit prozessorabhängig mal woanders sein sollte.
Marius D. schrieb:> OCR1B = 255;> _delay_ms (2);> OCR1B = 0;> _delay_ms (2);> pwm_flag = 0;> i = 0;
Erklär mal bitte. Wenn deine ISR also 254 erreicht hat, dann kommt das
hier ins Spiel? Was bezweckst du damit?
Weiterhin ist deine 'Sinustabelle' gar keine, du hast lediglich die
ansteigende Kurve, aber nirgendwo wird dann rückwärts gezählt, um den
abfallenden Sinus auszugeben.
Im Allgemeinen ist es keine gute Idee, in der ISR an OCR1B rumzufummeln
und das auch im Hauptprogramm zu machen, das schlägt der ISR ein
Schnippchen.
Definiere dir ein Flag, das das Hoch- und Runterzählen koordiniert und
nutze das dann konsequent nur in der ISR.
Als Tipp lies mal die AVR314 Application Note. Da werden per
Sinustabelle DTMF Töne erzeugt, was hier nützlich werden könnte.
Tassilo H. schrieb:> Hat der Attiny44a nicht nur 256 Bytes RAM?! Dann passt deine> Sinustabelle da nicht rein. Mach da mal> const __flash uint8_t sinewave[256]={> draus.
Eigentlich sollte 'const' schon dafür sorgen, ist aber auf jeden Fall
ein guter Hinweis. Ältere gcc futtern auch sowas:
1
constPROGMEMuint8_tsinetable[256]
Denke dran, wenn die Tabelle im Flash steht, kommst du da nur mit
const alleine reicht nicht.
Bei neueren GCCs einfach const __flash und dann ganz normal drauf
zugreifen. Bei alten GCCs PROGMEM und Zugriff dann nur mit den
pgm_read_... Funktionen. Wenn du nicht sicher bist, wie alt dein GCC
ist, einfach mit const __flash probieren, wenn der Compiler nicht
meckert, ist er neu genug :-)
Tassilo H. schrieb:> Hat der Attiny44a nicht nur 256 Bytes RAM?! Dann passt deine> Sinustabelle da nicht rein. Mach da mal> const __flash uint8_t sinewave[256]={> draus.
Danke sehr das hat sehr geholfen. Funktioniert jetzt sehr gut.
@ Matthias Sch.
werde deine Tipps beherzigen und schauen das ich es anders umsetzen
kann.
@ public (Gast)
Der Spannungseinbruch.
Marius D. schrieb:> @ public (Gast)> Der Spannungseinbruch.
Also das sieht nach einem zu großen Verbraucher aus, der kurze Zeit
später nicht mehr da ist bzw. durch den nachfolgenden Schaltungsteil
ausgeglichen werden kann.
Was kann da in der Software parallel passieren?
Gibt es einen elektrischen Verbraucher der Anfängt die Quelle (µC) zu
belasten?
Am besten nochmal Testen und Punkt für Punkt rückwärts messen bis zum
Ursprung deines Signals (µC)... ist da überhaupt eine Schaltung
dahinter?
beste grüße
public
public schrieb:> Also das sieht nach einem zu großen Verbraucher aus, der kurze Zeit> später nicht mehr da ist bzw. durch den nachfolgenden Schaltungsteil> ausgeglichen werden kann.
Ich glaube, das Problem ist behoben (s.o. Flash / RAM-Problematik)