Hi, ich versuche mit dem AtTiny45V am Port B2 (ADC1) einen Poti einzulesen, und dann eine PWM auf dem Timer 0b (PB1) auszugeben. Das ganze läuft auf 3,3V, und es funktioniert auch ca 10-20 Sekunden, danach hängt sich der Tiny einfach auf. Nach einem reset gehts wieder ein paar Sekunden. Aref (PB0) ist auf 3,3V gelegt und per software auf extern geschaltet, Abblock-Cs sind drin und Pull-Up für Reset auch. Wäre nett wenn mal jemand über das Programm schauen könnte, ich finde das Problem nicht
Warum sich das aufhängen soll, erschließt sich mir nicht. Allerdings ist manches etwas umständlich implementiert. Wenn du sowieso lückenlos den ADC anwerfen willst, warum dann das umständliche Gepolle auf ADSC? Schalt den free running mode ein (ADATE-Bit), und gut ist's. Den sleep-Mode muss man auch nur einmal setzen und nicht immer wieder, und eigentlich selbst das nicht einmal: IDLE ist ohnehin der default. Damit könnte man die Funktion readADC1() entsorgen und main() verkürzen zu:
1 | int main(void) |
2 | {
|
3 | timer_inestellen(); |
4 | ADC_init(); |
5 | sei(); |
6 | |
7 | // set_sleep_mode(SLEEP_MODE_IDLE);
|
8 | for (;;) |
9 | sleep_mode(); |
10 | }
|
Ja wieso er sich daran aufhängt weiß ich ja auch nicht, ich dachte es liegt eventuell am Programm. Zu den Verbesserung, stimmt so ist es besser, habe ich jetzt umgesetzt, aber hat leider noch den selben Fehler. Dann muss ich mir die Hardware nochmal anschauen, danke
Marcus P. schrieb: > Ja wieso er sich daran aufhängt weiß ich ja auch nicht, ich dachte es > liegt eventuell am Programm. > > Zu den Verbesserung, stimmt so ist es besser, habe ich jetzt umgesetzt, > aber hat leider noch den selben Fehler. Dann zeig noch einmal alles
Entweder ADC-Interrupt oder auf ADC pollen. Beides geht nicht. Das könnte Dein Fehler sein. Nimm mal das Sleep Zeugs raus. Mußt Du Strom sparen? Den Timerinterrupt brauchst Du nicht. Du kannst direkt den PWM-Wert setzen. Peter
So ich hab mir die Hardware nochmal angesehen. Ich habe jetzt mal den Stabi durch eine 5V Version ersetzt, jetzt funktionierts. Die Software wars wohl nicht, obwohl der Tiny45 ja eigendlich bei 3,3V bis 10MHz machen sollte... Naja danke euch, das Ihr mal drübergeschaut habt.
Peter Dannegger schrieb: > Entweder ADC-Interrupt oder auf ADC pollen. Beides geht nicht. Doch, schon, auch wenn's nutzlos ist (wegen free running mode). Er pollt ja nicht das ADIF sondern das ADSC, das geht schon.
Jörg Wunsch schrieb: > Doch, schon, auch wenn's nutzlos ist (wegen free running mode). Free running beißt sich dann aber mit dem Sleep: "Noise Reduction and Idle mode. To make use of this feature, the following procedure should be used: • Make sure that the ADC is enabled and is not busy converting. Single Conversion mode must be selected and the ADC conversion complete interrupt must be enabled. • Enter ADC Noise Reduction mode (or Idle mode). The ADC will start a conversion once the CPU has been halted." Peter
Naja den sleep-modus hatte ich da schon reingemacht damit er "Noise Reduction" bzw Idle macht, um störungen zu vermeiden. Allerdings ist es bei meiner Anwendung jetz nicht kritisch weshalb bei mir auch der Free-Running Modus funktioniert. Ich dachte ja zuerst auch das es was mit den Interrupts zu tun hat. Anbei packe ich mal den Code der jetzt läuft, allerdings nur bei 5V, mit 3,3V hängt er sich auf, warum auch immer.
Peter Dannegger schrieb: > Free running beißt sich dann aber mit dem Sleep: Das war mir gar nicht mehr in Erinnerung, dass er diesen Zirkus auch beim IDLE sleep mode macht.
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.