Hallo, ich habe mit Bascom ein Programm für einen Eigenbauregler geschrieben und zwar für den Attiny13 - Läuft perfekt. Da ich nun noch zusätzliche Features intrigrieren möchte aber der Tiny13 dafür vom Speicher nicht mehr ausreicht hab ich mir den Attiny25 besorgt und das Programm auf diesen gespielt. Leider gibt es beim Betrieb mit dem Tiny25 aussetzer d.h. er startet irgendwann einwach neu?! Woran kann das liegen (bei gleicher Software außer natürlich die andere Reg-File) gibt es da noch was zu beachten? Fuses? Hoffe Ihr könnt mir weiterhelfen.
Reset Pin ist per fuses ausgeschaltet weil ich den als Ausgang nutze. 100nf wohin? Spannungsversorgung hab ich drin und wie gesagt mit dem 13 in der gleichen Schaltung geht es ja
Die beiden Prozessoren sind teilweise nicht Bytecode-Kompatibel. Wenn der Prozessortyp im makefile umgestellt wird, sollte ein make clean folgen, da der Linker/Locator/Nenn-es-wie-du-willst sonst alte .o files zu fressen bekommt. Make weiß und sieht das evtl. nicht, die Quelldatei ist ja älter als die Zieldatei, die deswegen nicht neu gebaut wird... mfg mf PS: Ach, sorry, Bascom... hmmm... hab ich leider keine Ahnung. Probier mal ein komplett neues Projekt anzulegen?
Hi Ich arbeite zwar n icht mit BASCOM, aber ich geh davon aus, das eine Hochsprache so die grundsätzlichen Dinge erledigt.... so er weiß, was für ein Controller gegeben ist. Also, sie nochmal im Programm nach, ob der Compiler auch alle Parameter richtig eingetragen sieht... Prozessortyp, Takt etc. Danach fällt mir auch nur noch die Hardware ein. (Pinbeschaltung ?) Gruß oldmax
Programm nach dem Ändern der Reg- File auch wirklich neu kompilliert ? (d.h. neue, HEX- Datei erstellt ?)
Ja ich hab neu Kompiliert und Bascom hat auch die information über den neuen Controller. Die Tiny´s haben die gleiche Bauform und die Identischen Pins nur der 25er hat doppelt so viel flash wie der 13er. Der Code ist leider zimlich lang und unübersichtlich. Es wird zu begin des Programms die Signale der Fernbedienung eingelernt (wo vollgas, nullgas usw sind.) dann wird das auf eine PWM umgerechnet. Dies geschieht nur einmal beim Starten des Controllers danach geht es in eine endlosschleife die beim Tiny13 funktioniet aber nicht beim Tiny25, der wie oben beschrieben mitten im betrieb (Endlosschleife) neu startet.
Habs eingrenzen können, wenn ich folgendes Codesegment weglasse hab ich keine Ausfälle mehr. Aber verstehen tu ich das nicht was ist falsch an dem Code und warum führt er quasi zu einem Reset??
Hi Wenn man das Datenblatt vergleicht, dann kann der Pin PortB.4 vom ATTiny 25 noch ein paar weitere Dinge. Vielleicht fehlt in der Portinitialisierung etwas und er reagiert auf den Statuswechsel etwas eklig. Gruß oldmax
Bitte auch beachten, dass der tiny25 mit anderer frequenz rennt. tiny13 mit 9,6MHz oder mit Div8 1,2Mhz und der der tiny25 mit 8MHz oder 1MHz
Es gab's mal bei Bascom Probleme mit Tiny25 bei den Timern, also mal 'n Update machen. Sporadisches Aussteigen könnte auch auf Programmmurks hinweisen, der sich eben auf einem anderen Controller bemerkbar macht. Ein eingeschalteter Brownout wär' bei widriger Umgebung auch 'ne Ursache. Auch der Cpu-Clock unterscheidet sich, 9.6Mhz Tiny13 zu 8MHz Tiny25. Und von 'nem als Text geposteten Codeschnipselchen ernsthaft eine Hinweis auf den Fehler im Quellcode zu erwarten, ist eher als Witz einzuordnen.
Den 13er lass ich mit 1,2Mhz und den 25er mit 1Mhz laufen, dass sollte so gehen. Am PB.4 hab ich nur eine Led angeschlossen die bei Vollgas an geht und das läuft ja problemlos. Watchdog Timer haben sie beide auch wenn ich dessen funktion nicht ganz genau verstehe... Es liegt wie gesagt an dem oben geposteten Code, also den Aufruf des ADC an PB2 da hängt er sich irgendwie auf und started neu und ich hab keine Ahnung warum?!? Dabei fällt mir in der Schaltung auf das ich an dem Spannungsteiler am Eingan von PB2 keinen Kondensator dran habe, könnte das der Grund sein oder kann das Aufrufen des ADC noch etwas anderes auslösen?
nebenbei: warum egeintlich nicht
1 | Check_lipo: |
2 | 'Bei erreichen der Abschaltspannung geht nur noch maximal Halbgas! |
3 | Vm = Getadc(1) |
4 | If R > 128 And Vm < (S * 153) Then |
5 | R = 128 |
6 | Portb.4 = 0 'Vollgas LED aus |
7 | End If |
8 | Return |
Und statt Magic Numbers kann man bestimmt auch in Bascom Konstanten definieren
@Vald: Das geht nicht in der If-Anweisung noch eine Berechnung durchführen.
@MWS: Ich glaube nicht das das Problem vom Timer her kommt. Den kompletten Code will ich eigentlich nicht posten. Wie gesagt in der Endlosschleife für den Betrieb geht auch alles wenn ich den oben geposteten Code nicht aus der Schleife aufrufe. Welchen zusammenhang gibt es denn noch wenn ich den Analog-Digitalwandler aufrufe, besteht hier irgend ein zusammenhang mit einem Reset? Ach und Brownout ist per Fuses nicht eingeschaltet, aber auch hier muß ich geschtehen das ich diese Funktion auch nicht ganz verstehe...
Hier war mal in einem anderen Zusammenhang das Problem, dass ein Controller immer dann sporadische Probleme machte, wenn der ADC mit einer zu hohen Frequenz angesteuert wurde (ADC Clock Prescaler) Setz den Takt dochmal runter, wenn er recht hoch eingestellt ist,
Fabio schrieb: > Welchen zusammenhang gibt es denn noch wenn ich den > Analog-Digitalwandler aufrufe Wenn der ADC nicht gestartet wäre, dann könnte er im GetADC() hängen bleiben, würde aber nicht resetten. Für 'ne weitere Suche würde man im verdächtigen Codeteil z.B. das GetADC() auskommentieren und durch einen Festwert ersetzen, usw. Oder R = 128 fest setzen, denn die Probleme können ohne weiteres im anderen Code liegen, der diese Werte weiterverarbeitet und dann eben aussteigt. > Den kompletten Code will ich eigentlich nicht posten. Dann musst Du selbst weitersuchen.
Der Tiny25 kennt übrigens einen "ATtiny15 Compatibility Mode", den Du günstigerweise nicht per Fuse gesetzt hast.
@Dr G. Reed: der Prescaler steht auf Auto, ich kann aber auch einen Wert für festlegen. Was wäre denn ein sinnvoller Wert für den Prescaler bei 1Mhz? @MWS: Danke für den Tip werde mal in dem Codeteil Festwerte eingeben und nochmal teste vielleicht kann ich es weiter eingrenzen, ich bin mir aber fast sicher das das Problem nicht von meinem Code kommt sondern durch den Aufruf des ADC. Werde hierzu wie von Dr G. Reed vorgeschlagen den Wert des Prescalers ändern und weiter testen.
Das Datenblatt sagt hier: By default, the successive approximation circuitry requires an input clock frequency between 50 kHz and 200 kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate. It is not recommended to use a higher input clock frequency than 1 MHz. ADC Takt sollte also nicht höher als 1MHz sein
Du sagst das du mit dem Watchdog arbeitest, bowohl du die Funktion nicht richtig verstehst ... sind die beide auf die gleiche Dauer eingestellt? Wenn ja, dann stell die mal etwas höher.
Nein ich arbeite nicht mit dem Watchdog eben weil ich es nicht verstehe. Ich bin noch nicht lange am Programiere und hab mir mein wissen durch lesen im Netzt und der Bascom-Hilfe angeeignet. Ich werde den Prescaler jetzt auf 16 stellen dann wäre ich bei einem Takt von 1Mhz bei 62,5kHz stimmt doch oder?
Gute Nachrichten!!! Es lag wirklich am Prescaler des ADC jetzt steht er auf 16 und alles ist wunderbar! Komisch das die Auto-Funktion bei Bascom das nicht hinbekommen hat aber daran hätte ich nie gedacht. Also vielen Dank an allen von euch , ist ein klasse Forum hier!
Fabio schrieb: > @Vald: Das geht nicht in der If-Anweisung noch eine Berechnung > durchführen. Ok, bascom ist nicht so meins. Ist aber dann auch eine komische Grammatik. boolsche algebra darf man, aber integrale nicht? Dann ebend:
1 | Check_lipo: |
2 | 'Bei erreichen der Abschaltspannung geht nur noch maximal Halbgas! |
3 | Vm = Getadc(1) |
4 | Vthres = S * 153 |
5 | If R > 128 And Vm < Vthres Then |
6 | R = 128 |
7 | Portb.4 = 0 'Vollgas LED aus |
8 | End If |
9 | Return |
oder halt ähnlich, falls wieder was nicht passt. Mir gings auch eher ums Prinzip
Ja das müste gehen. Ich bin noch dabei den Code zu überarbeiten. Ich habs so geschrieben da es für mich verständlicher ist fals ich in ein paar Monaten nochmal drüber schauen muß. Also wegen der nachvollziehbarkeit.
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.