Forum: Mikrocontroller und Digitale Elektronik Migration von Arduino zu AVRStudio4 (AVRToolchain)


von Robert T. (tillule)


Lesenswert?

Hallo Ihr Lieben,

nachdem ich mich eine kleine Weile mit Arduino rumgeärgert habe, möchte 
ich mein Sainsmart 2560 Board gerne mit AVRStudio programmieren & 
simulieren können.

Ich kann den Mega2560 per ISP flashen und auslesen (auch die Fuses), 
aber wenn ich ein pimmeliges Programm flashe wie: mach ma PB7 High oder 
Low, passiert nüscht.

Meine Annahme: Der Arduino-Bootloader, der drauf ist, kackt quer.
Ich hab auch schon ein wenig an den Fuses rumgespielt (default Fuses 
geladen), aber ohne Erfolg.
Nun hab ich gelesen, dass eventuell die kompletten 
Interruptvektor-Adressen verschubst sein könnten; diese müsste man dann 
durch ein kleines Programm wieder zurechtschubsen: Aber wenn ich 
nichtmal nicht einen Pin (ohne IRQ) hochziehen kann, hab ich keine 
Hoffnung, dass ein kleine Routiene zum Zuge kommt, die iwelche Adressen 
wieder richtig schubst, abgesehen davon, dass ich mich schwertue zu 
wissen, welche Adressen wie wohingeschubst gehören.

Nun ist mein Equipment um den uC herum nicht das edelste, sodass 
Fehlerquellen von allen Seiten streuen könnten

Folgende Hardware/Software ist am Start.

Board:
Sainsmart Mega2560
http://www.sainsmart.com/sainsmart-mega2560-development-board-for-arduino.html

ISP-Programmer:
USBasp (ebay aus Übersee)

(Oszi: DSO203)

AVRStudio 4.19 mit AVRToolchain
Burn-O-Mat 2.1.1 zum Bedienen des USBasp

Mein Code schafft es im Simulator den gewünschten Pin auf high zu 
setzen.

Das Board sollte eigentlich funktionieren - zuletzt habe ich über 
Arduino ein Touchpanel erfolgreich angesteuert und ausgelesen. Als mir 
das Board dann beim Timer-IRQ immer einen Systemneustart hergezaubert 
hat, hat ich den Hals voll von Arduino und wollte mehr Kontrolle.

Danke fürs Beraten

Robert

von Joachim B. (jar)


Lesenswert?

schmeiss doch einfach den Bootloader raus und den BOOTRST vektor

oder nur den BOOTRST vektor dann kannst du leicher zurück, kannst aber 
auch den Bootsektor sichern.

und dann gehst wie immer
1
#define AUSL_DDR      DDRD
2
#define AUSL_LED_PORT  PORTD
3
#define _camAUS      1      // PD1
4
#define _camAF        0      // PD0
5
#define CAM_F        6
6
#define CAM_S        7
7
8
if(!(AUSL_DDR & (1 << _camAUS | 1 << _camAF)))
9
{  AUSL_DDR |= (1 << _camAUS | 1 << _camAF);
10
  AUSL_LED_PORT &= ~(1 << _camAUS | 1 << _camAF);
11
}
12
AUSL_LED_PORT |= (1 << _camAUS);

: Bearbeitet durch User
von Robert T. (tillule)


Lesenswert?

1
#include <avr/io.h>
2
3
#define OUTPUTPIN    PB7
4
#define OUTPUTPORT_DIRECTION  DDRB
5
#define OUTPUTPORT_WRITE  PORTB
6
#define OUTPUTPORT_READ    PINB
7
8
void main (void) {
9
10
  OUTPUTPORT_DIRECTION = 0x00 | (1<<OUTPUTPIN);
11
  OUTPUTPORT_WRITE |= (1<<OUTPUTPIN);
12
  
13
  while(1) {
14
15
  }
16
}
glaub der Code ist soweit fein - der soll nur einmalig einen hoch 
bekommen, dann gehts weiter mit Timer und Toggle.
1
schmeiss doch einfach den Bootloader raus und den BOOTRST vektor
2
3
oder nur den BOOTRST vektor
^^ja, so hat ichs mir gedacht, aber wie ... aber wie? Dachte mit 
BOOTRST-fuse auf 0 wärs getan :p

aktuelle Fusesetting:

efuse: 0xFF
hfuse: 0x99
lfuse: 0xEF

<=>

CKSEL0-3 = 0 (external Clock)
BOOTRST = 0
BOOTSZ0 = 1
BOOTSZ1 = 1

EESAVE = 0
WDTON = 0
SPIEN = 1
JTAGEN = 1
SUT0 = 1 (glaub das hieß Softstart)
SUT1 = 0

von Karl H. (kbuchegg)


Lesenswert?

Robert T. schrieb:

> ^^ja, so hat ichs mir gedacht, aber wie ... aber wie? Dachte mit
> BOOTRST-fuse auf 0 wärs getan :p

Ist es auch.
Sicher, dass du am richtigen Pin misst?

von Robert T. (tillule)


Lesenswert?

Nuja - hab jetzt nicht den ohmschen von Bord- zu uC-Pin gemessen - werd 
heut abend versuchen, mal alle Hände in die Luft zu heben (bis auf die 2 
Leitungen zum USB-uC, die sonst kollidieren könnten), dann sollten 
diverse Pins ja mit hoch gehen.

Das Pin-Mapping ist eigentlich in 
https://www.arduino.cc/en/Hacking/PinMapping2560 beschrieben (das 
Sainsmart Bord ist Arduino-kompatibel, sodass zB. PB7 mit der LED "L" 
verbunden sein muss)
Die Eagle-Files vom Arduino Mega2560-Bord sagen das gleiche.
Aber hast schon recht, ich nehme bisher nur an, dass das Mapping dem 
genannten Link entsprechen - gemessen hab ichs noch nicht.

Hab den Sohn nun an der Backe und heut Abend dann die Frau (was nicht 
nur schlecht ist) - ich danke schonmal fürs "Sicherheit geben", dass ich 
nicht zu doof bin, die kleinsten Handgriffe hinzubekommen. Tatsächlich 
hab ich schon über einige Jahre hinweg komplexere Programme für C51, 
C166 und ATCAN geschrieben, aber Bootloader nie angefasst und Gras 
gewachsen ist auch derweil.

Alla - Danke und ich meld mich nachm Layout Durchmessen

LG
Robert

von Klaus (Gast)


Lesenswert?

Hallo Robert,

als Alternative zur Arduino IDE würde ich dir
Atmel Studio 6 ( http://www.atmel.com/microsite/atmel_studio6/ )
in Verbindung mit Visual Micro ( http://www.visualmicro.com/ )
empfehlen.

Gruß

Klaus

von Robert T. (tillule)


Lesenswert?

AVRStudio6 läuft auf meinem Rechner zäh - werd nicht wenig auf der 
Arbeit (im Hausmeisterkabuff) mit nem noch älteren Laptop arbeiten.

AVRStudio4 hat damals gut funktioniert und ist "schlank", aber glaube 
Hauptargument ist: ich bin die Umgebung gewohnt.

@PinMapping und eigentliches Problem: Ja f.. die H..! Hab nen andren 
Pin, den ich über Arduino auf Bitebene angesprochen hatte dauergetogglet 
- funzte.
Hab dann den ursprünglichen an der LED hängenden genommen ... funzt 
auch.
Weiß jetzt nicht, warum es zuvor nicht ging, aber nudenn ... bin 
glücklich erstmal :)
(vllt waren die Steckbrett-Kontakte schuldig, auf die ich die Pins 
rausgezogen hab)

Wo wir beim Thema Fuses und Bootloader sind .....

Der Resetvector ist "disabled" (also auf erste Adresse hinter Bootsektor 
zeigend) wegen besagtem Flag, gelle?

Und im Bootsektor steht nach wie vor der Arduino-Loader? Ob ichs machen 
sollte/will/werde etc sei mal dahingestellt, aber welche Schritte müsste 
ich unternehmen, um den Bootloader komplett wegzufegen?

LG
Robert

von Karl H. (kbuchegg)


Lesenswert?

Robert T. schrieb:

> Der Resetvector ist "disabled" (also auf erste Adresse hinter Bootsektor
> zeigend) wegen besagtem Flag, gelle?

Richtig.
Was nichts anderes heisst, als das der µC bei der Adresse 0x0000 im 
Speicher seine Arbeit anfängt und nicht bei der eingestellten Adresse im 
Bootsektorbereich.

> Und im Bootsektor steht nach wie vor der Arduino-Loader?

Kommt drauf an. Da müsste man jetzt die Protection Bits überprüfen. Der 
Flash-Bereich, in dem der Bootloader steht, kann gegen überschreiben 
geschützt werden. Erwarten würde ich, dass dieser Schutz bei einem 
Original-Arduino auch aktiviert ist.
Wenn also dein Brennprogramm das Koommando gibt 'Flash löschen', dann 
wird dadurch der Bootloader eben nicht gelöscht. Sind die Schutzbits 
nicht gesetzt, dann bedeutet 'Flash löschen' dann auch wirklich: 
komplettes Flash löschen, wodurch der Bootloader Geschichte ist.

> Ob ichs machen
> sollte/will/werde etc sei mal dahingestellt, aber welche Schritte müsste
> ich unternehmen, um den Bootloader komplett wegzufegen?

Alle Brennprogramme haben normalerweise eine 'Clear' Funktion. Alles was 
nicht explizit mittels Fuse Bits geschützt ist, ist dann auch wirklich 
gecleared.

von Robert T. (tillule)


Lesenswert?

Danke Euch zwei Beiden für die netten Ratschläge. So 100% verstanden hab 
ich noch nicht warums mal nicht ging und nun geht, aber ich hab was über 
den Bootvektor gelernt :)

Bin jetzt schon weiter, als ich mit dem Arduino je gekommen bin (1. 
Timer-IRQ funzt).

@Klaus: nicht dass ich jemals wieder auf Arduino wollte. Aber hab mir 
Deinen 2. Link mal angeschaut ... wird dann konkurrenzfähig, wenn man 
Register im Simulator abbilden kann. Memspace scheint im Gegensatz zur 
ArduinoIDE schon einsehbar zu sein.
Generell ist das Arduino-Zeugs in meiner Welt eine schlechte Lösung. 
Glaub Urgedanke ist, Menschen das Autofahren ohne Führerschein zu 
ermöglichen und man hat dann Knöpfchen wie "Fahre 1Meter50 vorwärts" 
implementiert - wer 1Meter20 fahren mag, hat Pech gehabt und wenn man 
dann noch gleichzeitig den Knopf "Fenster runter" drückt, weiss man 
garnicht mehr, ob noch irgendwas fährt.
Meine Anwendung soll ein Ladegerät für den Modellbaubereich sein. 
Touchpanel+Shield war dabei - Arduino-Bibs gabs als Download - 
beeindruckend wie schnell man Sinuskurven zeichnen und Buttons drücken 
konnte.
Aber ebenfalls beeindruckend, wie lange die Abfrage dauerte, ob ne 
Eingabe am Touchpad anliegt. Dann krabbelt man sich durch den Code und 
stellt iwann fest die TFT-Lib nutzt Bit-Operatoren für Lese- und 
Schreibzugriffe, das serielle Touchpad nutzt den HighEnd-Befehl 
digitalWrite/Read, der glaub 1mS anstelle 1uS dauert - hält jmd den 
Finger aufs Panel, grübelt der also (geschätzt) 1/20 Sekunde rum.
Ein einhergehender Nachteil ist die große Flut Ahnungsloser, die 
Tutorials schreiben ... hab mal eins gesehen, in dem ein Spanier gezeigt 
hat, wie schlecht die Löcher auf meinem Board platziert sind und dass 
Schraubenköpfe mit Steckerleisten kollidieren. Gleiches gilt für IPhone- 
und Mutti-Foren; zu viele Menschen, die glauben zu wissen wies geht, was 
das Suchen nach Information müßig 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
Noch kein Account? Hier anmelden.