Forum: Mikrocontroller und Digitale Elektronik Fastboot startet Programmcode nicht zuverlässig


von The SphereX (Gast)


Lesenswert?

Hi Leute !!!

Ich habe mir auf 3 ATTinys (2 x ATTiny45, 1 x ATTiny85), die in 
verschiedene Anwendungen integriert sind, den Fastboot Bootloader 
installiert, damit ich auch den Reset-Pin als I/O verwenden kann. Das 
Ganze funktioniert soweit auch problemlos, allerdings mit einem kleinen 
Schönheitsfehler: Nur bei einem von drei Anwendungsneustarts 
(Einschalten der Stromversorgung) startet auch der eigentlich 
Programmcode. Ansonsten passiert nach dem Einschalten leider NICHTS. Ich 
schalte dann immer so lange ein und aus, bis das Programm auch 
tatsächlich ausgeführt wird. Und wie gesagt, nach drei Versuchen klappts 
dann meistens auch.

Woran könnte das liegen?

Die Tinys sind alle mit 32,768 kHz (Uhrenquarz) getaktet und der 
Bootloader ist auf One-Wire (Port PB1) eingestellt. An PB1 hängt eine 
LED, falls das irgendwie wichtig ist. Das dürfte ja aber eigentlich 
nicht stören, oder muß der One-Wire-Port frei bleiben? Macht ja keinen 
Sinn, denn dann gewinne ich zwar den Reset-Pin als I/O dazu, verliere 
aber den One-Wire-Pin. Also gehe ich mal davon aus, daß das Problem 
irgendwo anders zu suchen ist (?).

Grüße,
The SphereX

von Karl H. (kbuchegg)


Lesenswert?

The SphereX schrieb:

> Bootloader ist auf One-Wire (Port PB1) eingestellt. An PB1 hängt eine
> LED, falls das irgendwie wichtig ist. Das dürfte ja aber eigentlich
> nicht stören, oder muß der One-Wire-Port frei bleiben?

frei bleibe nicht.
Aber es wäre ziemlich gut, wenn der Pin, solange er am Anfang noch als 
Eingang fungiert, auch einen gesicherten Pegel hätte. Mit einem 
Vorwiderstand und einer LED zwingst du dem Pin aber keinen Pegel auf.
Hängt der Pin in der Luft, dann wirkt er wie eine Antenne. Ob das 
Programm den als 0 oder 1 einliest, hängt dann von den Umweltbedingungen 
wie eingeschalteter Staubsauger in der Nähe ab.

von The SphereX (Gast)


Lesenswert?

Demnach müßte ich also für die Zeit des Boot-Delays (in meinem Fall die 
standardmäßigen 330 ms), in welcher der Bootloader den Pin als Input 
schaltet und auf etwaige Programmierbefehle wartet, dafür sorgen, daß an 
PB1 ein gesicherter Pegel anliegt?

Wie ließe sich das am günstigsten bewerkstelligen?

Grüße,
The SphereX

von Peter D. (peda)


Lesenswert?

Mit 32kHz habe ich den Bootloader nicht getestet.

Teste mal als Applikation eine Endlosschleife, die die LED einschaltet 
und nichts weiter.

von The SphereX (Gast)


Lesenswert?

Ahh, der Meister persönlich ;-).

So, hab's gerade mal getestet. Mit dem Loop funktioniert es 
komischerweise ohne Probleme, d. h. die LED leuchtet sofort nachdem ich 
die Versorgungsspannung anlege. Was auch immer Dir das jetzt sagt?!

Grüße,
The SphereX

von Peter D. (peda)


Lesenswert?

The SphereX schrieb:
> Was auch immer Dir das jetzt sagt?!

Das es wohl nicht am Bootloader liegt.

von The SphereX (Gast)


Lesenswert?

Hmmm .... Soll heißen: Es liegt am Programm? Nur das es ohne Bootloader 
bis jetzt auch ohne diese Startprobleme funktioniert hat. Ich habe 
lediglich vor kurzem eine kleine Änderung an der Anwendung vorgenommen, 
die einen zusätzlichen I/O-Pin erfordert. Der Programmcode hat sich 
dabei aber nur sehr unwesentlich verändert, weshalb ich mal einfach 
davon ausgehe, daß es nicht daran liegt.

Dann ist mir im Übrigen auch noch aufgefallen, daß ich, solange die LED 
an PB1 angeklemmt ist, auch kein Programm-Update über den Bootloader 
durchführen kann. Die Ausgabe von FBOOT bleibt dann bei

>>>

******* Push Reset Botton *******

COM 3 at 600 Baud:

<<<

stehen, und es tut sich nichts, außer das die LED flackert. Klemme ich 
diese ab, funktioniert auch die Übertragung (Connected (One wire)...). 
Obwohl recht unpraktisch, ist das so sicherlich auf dem Steckbrett noch 
machbar, in meiner fertig zusammengelöteten Anwendung funktioniert's 
natürlich nicht. Dementsprechend muß ich den µC für ein Update immer aus 
dem Schaltkreis entfernen.

Grüße,
The SphereX

von Peter D. (peda)


Lesenswert?

The SphereX schrieb:
> Nur das es ohne Bootloader
> bis jetzt auch ohne diese Startprobleme funktioniert hat.

Der Bootloader verlängert die Resetzeit, vielleicht paßt das Deinem 
Programm nicht.
Du müßtest debuggen, wo Dein Programm hängen bleibt, z.B. kann man an 
einen Pin eine SW-UART senden lassen.

The SphereX schrieb:
> Dann ist mir im Übrigen auch noch aufgefallen, daß ich, solange die LED
> an PB1 angeklemmt ist, auch kein Programm-Update über den Bootloader
> durchführen kann.

Die LED belastet die UART zu stark, Du brauchst nen Treiber-FET.
Besser nimmt man daher nen Tasteneingang als Boot-Pin.

von The SphereX (Gast)


Lesenswert?

OK, dann danke ich Dir erst mal für die Infos! Künftig werde ich bei 
Verwendung des Bootloader darauf achten, nach Möglichkeit keinen LED 
ober ähnlich beschalteten Pin für das One-Wire-Interface zu benutzen.

Rein aus Interesse habe ich mich aber trotzdem mal an dem von Dir 
vorgeschlagenen Debugging versucht, allerdings nicht per SW-UART, denn 
dafür fehlen mir leider die Möglichkeiten (Fähigkeiten ;-) ...). 
Stattdessen habe ich mich einfach zeilenweise vorangearbeitet und 
jeweils einen END-Befehl mit vorhergehendem Einschalten der LED in 
meinen Programmcode eingebaut, um zu sehen, wie weit dieser ausgeführt 
wird.

Sehr weit bin ich dabei nicht gekommen, denn bereits nach der 
Hardware-Konfiguration (ADC, Timer0, Ports) im Programmcode war Schluß, 
d. h. die Dimensionierung der Variablen wurde schon nicht mehr 
ausgeführt.

>>>

$regfile = "attiny45.dat"
$crystal = 32768
$hwstack = 36
$swstack = 8
$framesize = 24

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer0 = Pwm , Prescale = 1 , Compare B Pwm = Clear Down

Config Portb.0 = Input
Config Portb.1 = Output
Config Portb.2 = Input
Config Portb.5 = Output

Pwm0b = 255
Portb.5 = 0

Taster Alias Pinb.0
Portb.0 = 1

---> BIS HIERHER WIRD DER CODE AUSGEFÜHRT <---

Dim Betriebsstatus As Bit
Dim Betriebsminuten As Word
Dim Bmtagstart As Word
Dim Bmtagende As Word
Dim Cfg_clock_hours_d1 As Byte
Dim Cfg_clock_hours_d2 As Byte
Dim Cfg_clock_minutes_d1 As Byte
Dim Cfg_clock_minutes_d2 As Byte
Dim Tag As Byte
Dim Stunde As Byte
Dim Minute As Byte
Dim Sekunde As Byte
Dim Taster_lang As Bit
Dim Tastendruck As Word
Dim Timer_counter1 As Word
Dim Timer_counter2 As Byte
Dim Fade As Byte
Dim Pause_led As Word
Dim Uldr As Word
Dim Uldr_temp As Word
Dim Uvcc As Word
Dim Uvcc_temp As Word
Dim Vcc_messung As Word
Dim Messungen As Byte

Cfg_clock_hours_d1 = 0
Cfg_clock_hours_d2 = 0
Cfg_clock_minutes_d1 = 0
Cfg_clock_minutes_d2 = 0
Tag = 0

....

>>>

Läßt sich aus diesem Ergebnis eventuell etwas ableiten?

Grüße,
The SphereX

von Peter D. (peda)


Lesenswert?

Im Bootloader:
1
;      remove comment sign to exclude Watchdog trigger:
2
;.equ   WDTRIGGER  = 0

Mach das ; mal weg.

von The SphereX (Gast)


Lesenswert?

Hat leider nichts gebracht.

Grüße,
The SphereX

von The SphereX (Gast)


Lesenswert?

Der Einfachheit halber, d. h. damit ich nicht immer das komplette 
Programm mit seinen 3445 Byte beim Testen übertragen muß, habe ich nach 
dem oben genannten Programmbeginn einfach

>>>

Pwm0b = 1
End

<<<

eingefügt und den restlichen Code gelöscht, so daß mein Testprogramm 
quasi nur noch aus dem Konfigurationsteil und dem Anschalten der LED 
besteht. Damit sind's dann nur noch 175 Byte. Aber auch hier zeigt sich 
dasselbe Problem: Die LED leuchtet nicht! Die Ausführung bleibt also 
nach wie vor bei der Variablendimensionierung hängen.

Grüße,
The SphereX

von The SphereX (Gast)


Lesenswert?

Ergänzung: Das Programm läuft bis zur Dimensionierung der viertletzten 
Variable, die nachfolgenden Befehle werden nicht mehr ausgeführt:

>>>

Dim Uvcc_temp As Word
Dim Vcc_messung As Word
Dim Messungen As Byte

Cfg_clock_hours_d1 = 0
Cfg_clock_hours_d2 = 0
Cfg_clock_minutes_d1 = 0
Cfg_clock_minutes_d2 = 0
Tag = 0

Pwm0b = 1
End

<<<

Grüße,
The SphereX

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

ich weiß zwar nicht genau wie Bascom hier vorgeht, aber die Definition 
einer Variable ohne das ein Wert zugewiesen wird sollte erst mal keinen 
Code für den Controller erzeugen, da kann also auch nichts hängen 
bleiben. Ist ja nur für den Compiler der damit der Variablen einen 
Speicherplatz zuweist.

Sascha

von The SphereX (Gast)


Lesenswert?

In der Tat, so sollte das wohl sein. Nur funktioniert es eben 
komischerweise mit Bootloader nur, wenn ich den Dimensionierungsteil 
weglasse. Ohne Bootloader war es bisher kein Problem.

Grüße,
The SphereX

von Peter D. (peda)


Lesenswert?

Du kannst ja mal das Programm mit dem Bootloader laden und dann mit ISP 
auslesen und in den Simulator laden.

Das erste Wort muß mit dem RJMP zum Bootloader ersetzt worden sein.
Und der RJMP direkt unter dem Bootloader muß der Einsprung in das Bascom 
Programm sein.

von The SphereX (Gast)


Lesenswert?

Hi Peter !!!

Nachdem Du ja angemerkt hast, den Bootloader noch nicht mit 32 kHz 
getestet zu haben, hätte ich eigentlich mein Programm gleich mal mit 
einer höheren Taktung probieren sollen, dann wäre mir wohl viel 
Herumprobieren erspart geblieben.

Ich habe einen ATTiny45 dementsprechend einfach mal auf die standard 8 
MHz (interner RCO) eingestellt, den Bootloader angepaßt und mein 
Programm dann nochmals damit getestet. Tja, und wie wohl zu erwarten 
war, gab's mit 8 MHz keine Probleme!

Damit ist wohl klar, daß der Bootloader zumindest mit Taktungen <= 32 
kHz irgendwie nicht zuverlässig funktioniert.

Soll ich die "RJMP Prüfung" jetzt trotzdem noch mal durchführen, oder 
ist die Taktung tatsächlich schon des Rätsels Lösung?

Grüße,
The SphereX

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
Noch kein Account? Hier anmelden.