Forum: Mikrocontroller und Digitale Elektronik Bootloader Verstandniss Frage


von gast (Gast)


Lesenswert?

Hallo,

Als Anfänger mit Microcontoller und c. Ich werde zum erstmal ein 
Bootloader auf einem mysmartcontrol mit atmega8 avr produkte schreiben.

Das Programm soll nur Hallo am Hterm senden.
Das Uart-software habe ich schon geschrieben und lauft ganz gut auf 
Stk500.

Jetzt weiss ich nicht wie ich anfangen soll und womit ich Anfangen muss 
um meinem Bootloader zu schreiben.

Habe ich schon SPI im Datenblatt gelesen, leider sind die Sache noch 
durcheinander in meinem Kopf.

Ich danke euch für eueren Hilfe
Grüß

von Karl H. (kbuchegg)


Lesenswert?

Warum willst du selber einen Bootloader schreiben? Noch dazu als 
Anfänger.

Geh in die Codesammlung und suche nach Bootlader. Da finden sich einige.

von gast (Gast)


Lesenswert?

danke für der Tipp

war ich schon und habe den Projekt Bootloader von:
Beitrag "Bootloader ATmega168"
genommen und für Atmega8  wie er sagte angepasst.

aber wie lade ich dann zu meinem mysmartcontrol, weil er nur einen usb 
anschluss hat mysmartcontrol und ist an com3 der PC.

mit AVRStudio finde ich mein Plattform nicht

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:

> aber wie lade ich dann zu meinem mysmartcontrol,

Normalerweise genauso wie jedes andere Programm auch. Die 
Programmiersoftware entnimmt die Position des Programms aus dem Programm 
selbst.

Danach müssen noch ein paar Fuses angepasst werden, damit der µC auch 
weiß, dass er einen Bootloader hat.

von Karl H. (kbuchegg)


Lesenswert?

Habe gerade die Produktbeschreibung zu deinem Board gelesen.

Das Teil hat doch schon einen Bootloader drauf!
Also lass besser die Finger davon, bzw. sieh in der Doku nach, wie man 
den Bootloader benutzt!

von gast (Gast)


Lesenswert?

Ja genau!

hat das Teil einen Bootloader und auch ein .EXE programm Tool.
Habe ich sogar genutzt um meinem Programm zu brennen, so weit klappt 
alles enwandfrei.

Nur das durch die Uart bekomme ich nur wirre Zeichen am Hterm.

Dachte ich dann, das es mit meiner Frequenz zu tun hat, weil mit STK500 
benutze ich eine externe frequenz von 4 Mhz und die platine ist mit 
3686400 Hz.

Also habe ich die Fuse eingestellt, leider war es nicht möglich die 
Fuses einszustellen.

Habe ich dann vom Platine die 3686400 Hz frequenz raus gelöt und eine 4 
Mhz da drauf gelötet. Dann ging nicht mehr der Bootloader.

Habe ich wieder raus genohmen und die 3686400 Hz frequenz wieder gelöt 
und bootloader war wieder möglich.

Habe ich dann bei myavr angerufen, und der Techniker dort hat mir 
gesagt, dass mann nicht durch das programm Tool die fuse setzen kann. 
Und die Platine ist so eingestellt dass der atmega8 nur extern mit die 
3686400 Hz frequenz arbeiten kann.Und dann wenn ich eine andere frequenz 
möchte, muss ich dann durch ISP programmieren.

Deswegen bin ich auf die idee gekommen.

viele grüsse

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:

> Deswegen bin ich auf die idee gekommen.
>

Und wie wäre es, wenn du dein Programm so umstellst, dass dort nicht von 
4Mhz sondern von den 3.6irgendwas Mhz ausgegangen wird.

Wäre das zu simpel, oder wie?

von gast (Gast)


Lesenswert?

Danke für deinen Hilfe

Das war meine erste Lösung frequenz umzustellen, leider ging nicht.

Das selber Programm lauft gut auf Stk500, aber nicht auf 
mySmartController
vielleicht liegt das Fehler wo anders?!?!


Hier unten meinem Code:
1
#ifndef F_CPU
2
#warning "F_CPU was not defined yet, now make up with 3686400"
3
#define F_CPU 3686400L    // 4000000 Systemtakt in Hz 
4
#endif
5
6
7
#define BAUD 9600L
8
#define UBRR_VAL 25 /*((F_CPU+BAUD * 8)/(BAUD*16)-1)     //clever round
9
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //real baud rate
10
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)     //Error per thousand
11
12
13
#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
14
#error Systematic error in the baud rate more than 1% and thus too high!
15
#endif*/
16
17
18
#include <avr/io.h>
19
#include <util/delay.h>
20
21
void USART_Init(void) 
22
{
23
  
24
  UBRRH = (unsigned char)(UBRR_VAL>>8);    // Set baud rate
25
  UBRRL = (unsigned char)UBRR_VAL;
26
  
27
  UCSRB |= (1<<TXEN);  // Enable transmitter
28
  
29
  UCSRC = (1<<URSEL) | (1<<UCSZ0)|(1<<UCSZ1);  // Set frame format: 8data, 1stop bit        
30
31
}//end USART_Init()
32
33
34
void USART_Putc(unsigned char c)
35
{
36
    while (!(UCSRA & (1<<UDRE))); 
37
  UDR = c;              // Put data into Buffer, sends the data
38
  _delay_ms(10);   
39
}//end USART_Putc()
40
41
42
void USART_Puts (char *string)
43
{
44
    while( *string != '\0' )  //as long as *string != '\0' 
45
    {  
46
        USART_Putc(*string);
47
        string++;
48
    }
49
}//end USART_Puts()
50
51
int main(void) 
52
{
53
  USART_Init();  
54
  while(1) 
55
  {
56
     USART_Puts("Hallo");    
57
  }
58
   return 0;                     
59
} //end main()

Gruß

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:

> Hier unten meinem Code:
>
1
> #ifndef F_CPU
2
> #warning "F_CPU was not defined yet, now make up with 3686400"
3
> #define F_CPU 3686400L    // 4000000 Systemtakt in Hz
4
> #endif
5
> 
6
> 
7
> #define BAUD 9600L
8
> #define UBRR_VAL 25 /*((F_CPU+BAUD * 8)/(BAUD*16)-1)     //clever round
9
> #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //real baud rate
10
> #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)     //Error per thousand
11
> 
12
> 
13
> #if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
14
> #error Systematic error in the baud rate more than 1% and thus too high!
15
> #endif*/

Warum lässt du denn das Makro nicht seine Arbeit machen und den 
richtigen UBRR_VAL Wert ausrechnen? Nein, stattdessen muss da wieder mal 
eine Konstante (25) her, die natürlich bei 3.6864 Mhz falsch ist.
Lass doch den Compiler die Drecksarbeit machen! Der macht das sehr 
zuverlässig und vergisst auch nichts, wenn sich mal die Taktfrequenz 
ändert.

von gast (Gast)


Lesenswert?

1
#ifndef F_CPU
2
> #warning "F_CPU was not defined yet, now make up with 3686400"
3
> #define F_CPU 3686400L    // 4000000 Systemtakt in Hz
4
> #endif
5
> 
6
> 
7
> #define BAUD 9600L
8
> #define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)     //clever round
9
> #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //real baud rate
10
> #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)     //Error per thousand
11
> 
12
> 
13
> #if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
14
> #error Systematic error in the baud rate more than 1% and thus too high!
15
> #endif

habe ich so gemacht weil mit dem Makro ging auch nicht. Und als ich per 
gerechnet habe, habe ich mir dann entschieden den Wert Ohne Makro 
einzugeben.

Sonst geht auch nicht wenn ich die Makro benutze.
Gruß

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
>
1
> #ifndef F_CPU
2
>> #warning "F_CPU was not defined yet, now make up with 3686400"
3
>> #define F_CPU 3686400L    // 4000000 Systemtakt in Hz
4
>> #endif
5
>>
6
>>
7
>> #define BAUD 9600L
8
>> #define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)     //clever round
9
>> #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //real baud rate
10
>> #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)     //Error per thousand
11
>>
12
>>
13
>> #if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
14
>> #error Systematic error in the baud rate more than 1% and thus too high!
15
>> #endif
16
>
>
> habe ich so gemacht weil mit dem Makro ging auch nicht. Und als ich per
> gerechnet habe, habe ich mir dann entschieden den Wert Ohne Makro
> einzugeben.

Das kann ich mir nicht vorstellen.
Wenn es mit 25 geht, dann geht es auch mit dem Makro.
Denn der Ausdruck im Makro, wenn man ihn ausrechnet, ergibt 25.
Bei 4 Mhz!

Bei 3.68Mkhz kommt da aber 23 raus und das ist auch der korrekte Wert 
für 3.68Mhz

von gast (Gast)


Lesenswert?

>Das kann ich mir nicht vorstellen.
>Wenn es mit 25 geht, dann geht es auch mit dem Makro.
>Denn der Ausdruck im Makro, wenn man ihn ausrechnet, ergibt 25.
>Bei 4 Mhz!

>Bei 3.68Mkhz kommt da aber 23 raus und das ist auch der korrekte Wert
>für 3.68Mhz

Genau, ich bin mit dir vollig einverstanden, das mit dem Makro  23 
rauskommt. Und ist richtig.

Nur dass entweder mitBei 4Mkhz kommt da 25 oder Bei 3.68Mkhz kommt da 23
bekomme ich immer wirre Zeichen.

Ich habe die Makro vorher nur weg gemacht um zu prüfen ob es an meiner 
Frequenz liegt!?!?

Leider ging immer nicht!!

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Moooment.
Ich denke das ganze funktioniert, wenn du es mit 25 auf dem STK-500 bei 
4Mhz laufen lässt?

Wo liegt dann das Problem.
Du stellst im Code die Frequenz auf 3.68Mhz um, compilierst neu und 
brennst es in die Schaltung. Dass diese Version auf dem STK-500 nicht 
mehr funktnionieren wird ist klar. Denn auf dem STK-500 läuft der µC ja 
mit 4Mhz und nicht mit 3.68Mhz.

Aber die 3.68 Version muss auf deiner Standalone Version funktionieren, 
denn die läuft ja (hoffentlich) auch mit 3.68Mhz.

Du hast also 2 Programmversionen. Eine für 4Mhz compiliert und eine für 
3.68Mhz compiliert. Und natürlich läuft jeder der beiden Versionen nur 
auf der jeweils für sie richtigen Hardware.

Aber damit du beim Umstellen der F_CPU im Programm nicht allzuviel 
Arbeit hast, brauchst du das Makro.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Nochmal zur Verständnis:

Du hast einen Atmega8 am STK-500 mit 4Mhz Takt?
Dort hast Du ein Programm drauf, welches den Text "Hallo" auf dem UART 
ausgibt und welchen Du dann im Hterm sehen kannst?
Ist dort der gleiche Bootloader drauf wie auf dem anderen Board?

Jetzt hast Du noch einen mysmartcontrol. Dieser hat ebenfalls einen 
Atmega8, wird jedoch mit 3.68Mhz getaktet?
Dort soll das gleiche Programm (andere Version für anderen Takt) laufen?
Liefert dieser fünf wirre Zeichen oder viel mehr?

Könnte es sein, dass dies die Bootloader-Kommunikation ist, der aus 
irgend einem Grund nicht in das Programm weiter springt, sondern in 
seinem Modus bleibt und dich dann mit diesen "binären" Zeichen begrößt?

von gast (Gast)


Lesenswert?

>Aber die 3.68 Version muss auf deiner Standalone Version funktionieren,
>denn die läuft ja (hoffentlich) auch mit 3.68Mhz.

ja ich verstehe was du meinst.

leider funktioniert die 3.68 Version nicht auf mysmartcontrol atmega8 
3,68 Mhz.

Frequenz Baudrate habe ich schon alles nachgeprüft.
Code ist genau wie gepost.
Gruß

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

gast schrieb:
> Also habe ich die Fuse eingestellt, leider war es nicht möglich die
> Fuses einszustellen.

Dann liegt es wohl daran. Oder hast Du das nun hinbekommen?
Kommt auch der richtige Takt beim Prozessor an (eventuell nur 1/8)?
Mal mit LED und Timer überprüfen => 1Hz Blinkfrequenz.

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:

> leider funktioniert die 3.68 Version nicht auf mysmartcontrol atmega8
> 3,68 Mhz.

Dann sollte man als allererstes mal die 3.68 Mhz überprüfen
1
#define F_CPU 3686400L
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main()
7
{
8
  DDR. = 0xFF; ....   was auch immer du brauchst um an einem Port eine LED
9
                      ansteuern zu können
10
11
  while( 1 ) {
12
    PORT. = 0xFF;  ....... was auch immer du tun musst um die LED
13
                            einzuschalten
14
15
    _delay_ms( 1000 );
16
17
    PORT. = 0x00;  ...... was auch immer du tun musst um die LED auszuschalten
18
19
    _delay_ms( 1000 );
20
  }
21
}

compilieren, auf den mysmart brennen und laufen lassen.
Blinkt die LED im Sekundentakt (1 Sek ein, 1 Sek aus) oder sind es eher 
3 Sekunden? Oder ist es vielleicht sogar viel weniger.

Wenn das gefühlsmässig mit der 1 Sekunde in etwa hinkommt:
Mit einer Stoppuhr bewaffnen. Beim LED-ein starten und 10 oder 20 
Blinker mitstoppen. Im Idealfall bleibt deine Uhr nach dem 20.ten 
Blinker ziemlich genau bei 39 Sekunden stehen. Dann kann man schon 
ziemlich genau sagen, ob der µC auch wirklich mit 3.68Mhz läuft.

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:

> Frequenz Baudrate habe ich schon alles nachgeprüft.
> Code ist genau wie gepost.
           *****

Wenn er genau wie gepostet war, dann war er falsch :-)
Denn für 3.68Mhz hätte bei UBRR_VAL 23 stehen müssen und nicht 25

von gast (Gast)


Lesenswert?

@Karl heinz Buchegger
danke, gut idee ich tue es und dann melde ich mich wieder
gruß

von gast (Gast)


Lesenswert?

Hallo Karl heinz Buchegger,

entschuldigung aber gestern habe ich kein Zeit mehr gehabt.
Ich habe das Programm gerade auf mySmartController gebrannt.
Die LED Blinken im Sekundentakt (1 Sek ein, 1 Sek aus).

Was bedeutet dass?

Das ich als frequenz 1Mhz drin habe?
1
#define F_CPU 3686400L
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main()
7
{
8
  DDRB = 0xFF; //was auch immer du brauchst um an einem Port eine LED
9
                      //ansteuern zu können
10
11
  while( 1 ) 
12
  {
13
    PORTB = 0xFF;  //was auch immer du tun musst um die LED
14
                            //einzuschalten
15
16
    _delay_ms( 1000 );
17
18
    PORTB = 0x00;  //was auch immer du tun musst um die LED auszuschalten
19
20
    _delay_ms( 1000 );
21
  }
22
}

Gruß

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

gast schrieb:
> Hallo Karl heinz Buchegger,
>
> entschuldigung aber gestern habe ich kein Zeit mehr gehabt.
> Ich habe das Programm gerade auf mySmartController gebrannt.
> Die LED Blinken im Sekundentakt (1 Sek ein, 1 Sek aus).
>
> Was bedeutet dass?
>
> Das ich als frequenz 1Mhz drin habe?

Nein.
Es bedeutet, dass Dein Quarz verwendet wird (sonst wären es 8MHz mit 
internem Oszillator bzw 1MHz wenn doch die DIV8-Fuse gesetzt ist).

"(1 Sek ein, 1 Sek aus)" bedeutet zunächst nur etwa 4MHz (ich weiß 
nicht, ob man mit bloßem Auge die 4MHz von 3,6MHz unterscheiden kann - 
außer man hat ein Vergleichsnormal).

Hast Du mehrere Blinkperioden (zB 20) mit der Stoppuhr verglichen und 
stimmt die Gesamtzeit immer noch, sind es genau 3,6MHz.

von gast (Gast)


Lesenswert?

>Hast Du mehrere Blinkperioden (zB 20) mit der Stoppuhr verglichen und
>stimmt die Gesamtzeit immer noch, sind es genau 3,6MHz.

ja es steht genau nach dem 20.ten Blinker ziemlich genau bei 39 
Sekunden.

Mein Frequenz ist dann genau 3.68MHz, warum geht dann das Programm nicht 
auf die Platine

Unter ist der code
1
#ifndef F_CPU
2
#warning "F_CPU was not defined yet, now make up with 3686400"
3
#define F_CPU 3686400L    //Systemtakt in Hz 
4
#endif
5
6
7
#define BAUD 9600L
8
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)     //clever round
9
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //real baud rate
10
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)     //Error per thousand
11
12
13
#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
14
#error Systematic error in the baud rate more than 1% and thus too high!
15
#endif
16
17
18
#include <avr/io.h>
19
#include <util/delay.h>
20
21
void USART_Init(void) 
22
{
23
  
24
  UBRRH = (unsigned char)(UBRR_VAL>>8);    // Set baud rate
25
  UBRRL = (unsigned char)UBRR_VAL;
26
  
27
  UCSRB |= (1<<TXEN);  // Enable transmitter
28
  
29
  UCSRC = (1<<URSEL) | (1<<UCSZ0)|(1<<UCSZ1);  // Set frame format: 8data, 1stop bit        
30
31
}//end USART_Init()
32
33
34
void USART_Putc(unsigned char c)
35
{
36
    while (!(UCSRA & (1<<UDRE))); 
37
  UDR = c;              // Put data into Buffer, sends the data
38
  _delay_ms(10);   
39
}//end USART_Putc()
40
41
42
void USART_Puts (char *string)
43
{
44
    while( *string != '\0' )  //as long as *string != '\0' 
45
    {  
46
        USART_Putc(*string);
47
        string++;
48
    }
49
}//end USART_Puts()
50
51
int main(void) 
52
{
53
  USART_Init();  
54
  while(1) 
55
  {
56
     USART_Puts("Hallo");    
57
  }
58
   return 0;                     
59
} //end main()

von gast (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:

>Wenn das gefühlsmässig mit der 1 Sekunde in etwa hinkommt:
>Mit einer Stoppuhr bewaffnen. Beim LED-ein starten und 10 oder 20
>Blinker mitstoppen. Im Idealfall bleibt deine Uhr nach dem 20.ten
>Blinker ziemlich genau bei 39 Sekunden stehen. Dann kann man schon
>ziemlich genau sagen, ob der µC auch wirklich mit 3.68Mhz läuft.

Wie kommst du drauf, dass wenn der µC auch wirklich mit 3.68Mhz läuft, 
muss nach dem 20.ten Blinker ziemlich genau bei 39 Sekunden stehen.

Ich habe die delay Datei aufgemacht um mit der Funktion _delay_ms(double 
__ms) die Rechnung vorzuziehen, leider kriege ich nichts.

Kannst du mir bitte erklären!?!
gruß

von Stefan E. (sternst)


Lesenswert?

gast schrieb:
> Karl heinz Buchegger schrieb:
>
>>Wenn das gefühlsmässig mit der 1 Sekunde in etwa hinkommt:
>>Mit einer Stoppuhr bewaffnen. Beim LED-ein starten und 10 oder 20
>>Blinker mitstoppen. Im Idealfall bleibt deine Uhr nach dem 20.ten
>>Blinker ziemlich genau bei 39 Sekunden stehen. Dann kann man schon
>>ziemlich genau sagen, ob der µC auch wirklich mit 3.68Mhz läuft.
>
> Wie kommst du drauf, dass wenn der µC auch wirklich mit 3.68Mhz läuft,
> muss nach dem 20.ten Blinker ziemlich genau bei 39 Sekunden stehen.

Er kommt darauf, weil _delay_ms(1000) für 1 Sek verzögert, aber nur 
dann, wenn F_CPU auch mit dem tatsächlichen Takt übereinstimmt. Wenn 
z.B. F_CPU auf 8000000 steht, der Takt aber tatsächlich 1 MHz ist, dann 
verzögert _delay_ms(1000) für 8 Sekunden statt für eine.

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.