PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega32 über RS232 Programmieren



Ertugrul
21.06.2010, 18:35
Ich programmiere für ein Schulprojekt einen Controller Board mit ATMega32 (von Robotikhardware). Ich würde dies gerne über die RS232 schnittstelle machen aber ich bekomme ständig das Problem das ich nicht über das "Sending Init Byte" Hinauskomme (MSC Bootlader).
Könnte mir jemand helfen was ich Einstellen muss benutze Bascom-AVR demo.

Sorry wenn der Text nicht so gut Deutsch ist und wenn die frage schon ziemlich oft gestellt wurde ich surf schon den ganzen Tag und verstehe es nicht.

Vitis
21.06.2010, 18:56
aaalso, Du versuchst über einen Bootloader zu flashen. Der Bootloader ist ein kleines Programm, das in einem bestimmten Bereich des Programmspeichers Deines Bausteins sein muss. Von Haus aus kommen die AVRs ohne dieses Progrämmchen geliefert, leider. Das bedeutet, dass dieses Progrämmchen in der Regel erst auf den Controller per ISP geflasht werden muss.
Ist der Bootloader dann drinnen, oder in Deinem Fall u.U. schon drinnen, dann macht er normalerweise genau das was der Name sagt, er lädt beim Booten des Bausteins, sprich wenn der Controller resettet geht er erst in den Bootloader und lauscht ne Weile ob per serieller Schnittstelle ein passendes Signal kommt das er in den Flashmodus geht. Das ist die Geschichte mit dem "Init Byte". Sprich, Du musst praktisch Dein Flashen starten, damit der Init gesendet wird und dann den Controller resetten, damit er in den Loader geht, so dieser schon da ist. Isser nicht da passiert einfach garnix.

Ertugrul
21.06.2010, 19:18
*hust* ich habe keine ahnung wie ich das mache (neuling auf dem gebiet)

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32

$crystal = 16000000 'Quarzfrequenz
$baud = 38400


'Funktionen und Unterprogramme
Declare Sub Motorzu()
Declare Sub Motorauf()
Declare Function Tastenabfrage() As Byte

'Motorenkonfiguration
Config Pinc.6 = Output
Config Pinc.7 = Output
Config Pind.4 = Output

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pind.5 = Output

Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage

Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1

Dim Taste As Byte
Dim I As Integer



'Hauptprogramm
Do
Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Wait 300
Sound Portd.7 , 150 , 600
Call Motorzu
Waitms 2000
Sound Portd.7 , 600 , 600

End Select
End If

Waitms 100
Loop

End


Function Tastenabfrage() As Byte
Local Ws As Word

Tastenabfrage = 0
Start Adc
Ws = Getadc(7)
' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Case 330 To 380
Tastenabfrage = 2
Case 260 To 305
Tastenabfrage = 3
Case 180 To 220
Tastenabfrage = 4
Case 90 To 130
Tastenabfrage = 5
' Case Else
' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
End Select

End If

End Function

Sub Motorauf()
Portd.4 = 1
Portd.5 = 1
I = 0

Do 'Drehen gegen Uhrzeigersinn
'Schritt 1
Portc.6 = 1 'Spule 1
Portc.7 = 0


Portb.0 = 1 'Spule 2
Portb.1 = 0

Waitms 5
'Schritt 2
Portc.6 = 1 'Spule 1
Portc.7 = 0

Portb.0 = 0 'Spule 2
Portb.1 = 1

Waitms 5
'Schritt 3
Portc.6 = 0 'Spule 1
Portc.7 = 1

Portb.0 = 0 'Spule 2
Portb.1 = 1

Waitms 5
'Schritt 4
Portc.6 = 0 'Spule 1
Portc.7 = 1

Portb.0 = 1 'Spule 2
Portb.1 = 0

Waitms 5
I = I + 1
Loop Until I = 354 'Laufzeit
Portd.4 = 0
Portd.5 = 0
End Sub


Sub Motorzu()
Portd.4 = 1
Portd.5 = 1
I = 0

Do 'Drehen im Uhrzeigersinn
'Schritt 1
Portc.6 = 0 'Spule 1
Portc.7 = 1


Portb.0 = 1 'Spule 2
Portb.1 = 0

Waitms 5
'Schritt 2
Portc.6 = 0 'Spule 1
Portc.7 = 1

Portb.0 = 0 'Spule 2
Portb.1 = 1

Waitms 5
'Schritt 3
Portc.6 = 1 'Spule 1
Portc.7 = 0

Portb.0 = 0 'Spule 2
Portb.1 = 1

Waitms 5
'Schritt 4
Portc.6 = 1 'Spule 1
Portc.7 = 0

Portb.0 = 1 'Spule 2
Portb.1 = 0

Waitms 5
I = I + 1
Loop Until I = 354
Portd.4 = 0
Portd.5 = 0
End Sub

das is mein Prog ( hab n Test Prog genommen und angepasst wie ichs brauche) aber ich hab echt 0 ahnung ....

Ertugrul
21.06.2010, 19:35
arghh jezz kommt com port 4 is not available .

hab in den Optionen beim Loader und so die ports alle auf com4 gestellt, die Baudrate habe ich überall sowie im Programm ich weiß irgendwie nicht was ich noch tun soll ....

mat-sche
21.06.2010, 20:14
Hi Ertugrul,

zu erst einmal ist für die Benutzung des Bootloaders wichtig, die FUSE-Bits dafür einzustellen, die ein Bootloaderprogramm erst zum leben erweckt.
Der sogenannte Resetvector zeigt im ausgelieferten Zustand auf die Adresse &H000. Dies ist die erste Adresse im Programmspeicher. Jetzt musst Du über die Fuse diese so umstellen, dass der Resetvector nicht auf &H000 zeigt sondern auf den Speicherplatz in dem der Bootloader liegt. Der MCS Bootloader brauch die Größe von 1024 bit, auch wieder über die Fuse einstellbar. Einfach mal zu den Fuses & Bascom googeln.
Nach dem Du die Fuse gestellt hast musst Du den Bootloader über die SPI-Schnittstelle auf den ATMega flashen.
Danach solltest Du über die RS232 Schnittstelle (richtig Aufbau der Schnittstelle ==> max232 muss zwischen mega & PC-Schnittstelle!!!) das Programm aufspielen können. Das Bootloaderprogramm funktioniert folgend:
So bald der mega in den reset geschickt wird, springt er dann automatischen in den Bootloader. Dieser wartet auf ein 123, ist dieses empfangen worden, schickt er eine 124 zurück.
Wichtig ist noch, dass die gewählte Baudrate, mit der der Bootloaderprogramm arbeitet auch für die Übertragung gewählt wird! Ansonsten erkennt er das 123 nicht

Gruß MAT

Ertugrul
21.06.2010, 20:36
vielen dank ich werde das nun mal probieren :D

hab ich das richtig verstanden das man für die Fuses ein ISP kabel braucht oder check ich da was net ... ein Klassenkamerad hatt es ohne gemacht allerdings kanner mir nicht sagen wie -.-

mat-sche
22.06.2010, 07:03
Moin,

schau Dir mal die Seite an: http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht

Dort findest Du auf die meisten Fragen eine Antwort und den Einstieg in die AVR Welt! Wenn dann noch Fragen offen sind einfach schreiben.
ABER ! erst dort lesen, lesen, lesen.....

MAT

Andun
22.06.2010, 14:05
Wichtig zu erwähnen scheint mir in dem Zusammenhang auch:

Hat dein Kumpel das selbe Board wie du? Wie hat er den Bootloader aufgespielt, bzw. ist der vielleicht schon drauf?

Falls er schon drauf ist und du ihn nur nicht ansprechen kannst, verkonfigurierst du dir das ganze vielleicht auch nur.

Also klär doch mal generell was du schon hast und was noch fehlt.

Richard
22.06.2010, 14:57
Frage welches Board habt ihr überhaupt? Es gibt welche mit und ohne
Bootloader! Dann wichtig! Wenn der µC zwischendurch einmal über
ISP Programmiert wurde, ist der Bootloader ....WECH. :-(

Ansonsten hat das bei mir mit Bascom und MCS Loader gut geklappt.
MCS Loader starten und Reset drücken.....

Gruß Richard

Vitis
23.06.2010, 08:55
Frage welches Board habt ihr überhaupt? Es gibt welche mit und ohne
Bootloader! Dann wichtig! Wenn der µC zwischendurch einmal über
ISP Programmiert wurde, ist der Bootloader ....WECH. :-(


nein, nicht zwingend. Nur wenn der Loaderbereich mit überschrieben wurde oder n Erase durchgeführt wurde. Mach ich öfters, dass ich vorab den Loader flashe und dann je nach belieben ISP oder per Loader flashe ... je nach dem welche Gerätschaft ich gerade zur Hand habe :)

guenter1604
23.06.2010, 22:22
Daß da auf den ATMega ein kleines Progrämmchen namens Booloader drauf muß dürfte jetzt ja klar sein. Damit man aber über seriell in die Programmierung "einsteigen" kann muß man im eigentlichen Programm eine Möglichkeit schaffen:

If Pinb.2 = 0 Then
Goto &HC00
End If

Hier wird z.B. geprüft, ob ein Eingangspin low ist und dann in den Bootloader gesprungen. Das kann man auch anders machen, entscheidend ist Goto &HC00. Wobei der Wert je nach Chip variiert.
Danach gehts dann im Code des Bootloaders weiter, der sich dann mit dem PC über seriell unterhält.

Wer da auch unter die Haube schauen will:
Der Bootloader für den ATMega liegt bei Bascom als Quelltext vor. Die Software für den PC leider nicht. Deshalb habe ich einen in VB.NET geschrieben. Quelltexte siehe: http://www.gerold-online.de/cms/uc-projekte/microcontroller/bootloader-fuer-avr.html

Günter

mat-sche
25.06.2010, 16:53
Hi,
noch einfacher gehts wenn mann die Schnittstelle nach einem Zeichenempfang abfragt:


Rs232_flash = Ischarwaiting()
If Rs232_flash = 1 Then 'wurde was über RS232 empfangen?
Rs232_str = Inkey() 'Empfangspuffer auslesen
If Rs232_str = 123 Then 'vom MCS-Programmer geschickte "123" empfangen?
Goto &HF800 'Sprungadresse zum Startbereich des Bootloaders
End If
End If


sobald eine 123 empfangen wurde spring dann das Programm in den bootloaderbereich.

Gruß MAT