Sally Zusammen, ich habe das Problem, dass mein Timer (90s8535) nicht richtig geht. Ich sollte 3 pegel ausgeben, bekomme aber nur einen. Woran kann das liegen? void wait(int waiti) { waiti -= 13; // Korr. um 13 µs bei 8 Mhz (Genauigkeit +/- 0.6 µs) TCNT1 = 60000 - waiti; //TCNT1 = zeit in 16bit portregister TCCR1B = 0x02; //vorteiler ck/8 TIFR |= (1<<TOV1); //TOV1 gesetzt TIMSK |= (1<<TOIE1); //TOIE1 gesetzt intflag_sb.bit.t1 = RESET; //in while schleife sei(); while (!intflag_sb.bit.t) { } TIMSK &= ~0x04; //timer interr. aus } //////// void send(int one, int two, int three) { SET(PORTD,0x80); wait(one); RESET(PORTD,0x80); wait(two) SET(PORTD,0x80); wait(three); RESET(PORTD,0x80); } send(10,30,20);
Warum postet eigentlich keiner mal ein vollständiges Programm, sondern nur solchen zusammenhanglosen Kernschrott? Und dann Hilfe erwarten... Ganz toll. Auf jeden Fall kann ich aus dem obigen Gedöns nichts, aber auch gar nichts erkennen, außer dass da schon einige Unstimmigkeiten drin sind und die Kommentare absolut ohne Aussagekraft sind. Wenn man dazu was sagen soll, muss einem schon mitgeteilt werden, was das Programm eigentlich machen soll und was es macht. "3 Pegel ausgeben" aber "bekomme nur einen" sagt gar nichts!
Ich muss jonny.m Recht geben. Ausserdem gibt der AVR bestimmt nur 2 (ZWEI) Pegel aus: High (VCC) und Low (0V). Gruß, Magnetus
Reduzierung ist natürlich erwünscht, ABER: - nie nur so ähnlich aus dem Kopf, sondern immer mit copy&paste - es muß fehlerfrei compilierbar sein - der Fehler muß noch auftreten - es muß geprüft worden sein, daß der Fehler immer noch auftritt, bevor man es postet !!!! Und ne Fehlerbeschreibung muß immer so aussehen: - was wurde erwartet - was passierte statt dessen Dann kann man auch helfen. Peter
> void send(int one, int two, int three) > { > SET(PORTD,0x80); > wait(one); > RESET(PORTD,0x80); > > wait(two) > > SET(PORTD,0x80); > wait(three); > RESET(PORTD,0x80); > } Wenn du mit "3 Pegel" --> "3 positive Impulse" meinst wundert es mich nicht. Diese Funtion erzeugt dir immer nur: High | |_| |_ Low Beim Aufruf mit send(10,30,20); kommt dann: High _ ___ | |______| |_ Low 10 30 20 Gruß, Magnetus
Guten Morgen, mein Problem ist, dass ich nur einen Impuls bekomme, also hier nur 10, wenn ich mit send(10,30,20); alles abschicke. die anderen zwei Impulse bekomme ich nicht mehr auf dem Oszi zu sehen. Fehler gibt es beim compilieren auch keine und Warnungen bekomme ich auch nicht. Da ich die waitfunkt. schon mal ausgetauscht habe, und das ganze auch schon funktioniert hat(=alle Impulse ausgeben) bin ich der Meinung, dass mein Fehler in der Initiallisierung der Interrupts liegen muss. Aber wie schon geschrieben, er bringt mir keine Warnungen und auch keine Fehler. Und dann den ganzen Code zu posten wäre Quatsch, da ich den "Fehler" schon so weit eingrenzen kann! Mfg
Dann lass es halt, und grenze noch weiter selber ein. Schließlich lernt man am besten durch Erfahrungen, die man selbst erfährt. Ein nettes tool für solche Fragestellungen ist vmlab. Das gibt es als freeware, und kann beim debuggen dieser Fragestellungen eine echte Hilfe sein. Oliver
--- void send(int one, int two, int three) { SET(PORTD,0x80); wait(one); RESET(PORTD,0x80); wait(two) SET(PORTD,0x80); wait(three); RESET(PORTD,0x80); } --- bei dem wait(two) fehlt das ;
Oli K. wrote:
> Und dann den ganzen Code zu posten wäre Quatsch
Da stimme ich Dir zu.
Aber Du must soviel posten, daß man es auch verstehen kann.
Und das geht nur, wenn man sämtliche verwendeten Variablen und
Funktionen kennt.
1 | ...
|
2 | intflag_sb.bit.t1 = RESET; //in while schleife |
3 | ...
|
4 | RESET(PORTD,0x80); |
5 | ...
|
Du hast als eine unbekannte Funktion "RESET" und deren Adresse im Flash weißt Du der ebenfalls unbekannten Variable "intflag_sb.bit.t1" zu. Was soll das ? Wie soll das ein anderer verstehen ? Peter
Hast du deinen Funktionsaufruf auch mal mit nur einer Zahl ausprobiert? send(10,10,10)?
Mein Reset habt ich im Headerfile deklariert: RESET(x,y) (x &= (~y)); und das Bit vom Bitfeld wurde auch im Header deklariert und wird noch mal verwendet: SIGNAL(SIG_TIMER1) //statt SIGNAL habe ich auch schon INTERRUPT eingesetzt //void timer1_interrupt(void) //zum testen { intflag_sb.bit.t1over_b = 1; sei(); } ansonsten wird das Bit nicht mehr genutzt. die Funktion habe ich schon in allen Varianten ausprobiert.
> Und dann den ganzen Code zu posten wäre Quatsch, da ich den > "Fehler" schon so weit eingrenzen kann! Die übliche vorgehensweise ist es, den Teil bei dem du Probleme hast in ein neues, komplettes Programm zu verpacken (also mit main() und allem was dazugehört, so dass man es kompilieren kann) und dieses Programm zu posten. Vorher aber sicherstellen, dass das Problem immer noch da ist. Man sollte nicht glauben, wievielen Leuten (inkl. mir) es beim Zusammenstellen solcher Testprogramme wie Schuppen von den Augen fällt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.