Forum: Mikrocontroller und Digitale Elektronik Direkte Programmierung des Arduino Micro


von Marco W. (gubelat)


Lesenswert?

Als 16 Jähriger Blag habe ich auf einem C64 einen Auerswald DLC 4830
inklusive allen Bitmustern aus dem ROM des DLC so gut es ging in 
Assembler
nachgebaut. Die Ansteuerung lief damals über den Userport der über 
Transistoren Solid State Relais ansteuerte.

Heute bin ich 42 und dachte es ist Zeit sich endlich mal mit µC zu 
befassen.
Naiv wie ich bin dachte ich besogst du dir ein Arduino Mikro Board.
Nach der Instalation und dem ersten Wechselblinken von LEDs vermisse ich 
aber doch das direkte programmieren der Hardware.

Nehmen wir an ich habe IO Ports 0-7 als Ausgang definiert und möchte
nun meine Bitmuster aus dem RAM/ROM oder Flashspeicher auslesen und 
direkt in die IO Register der Ports schreiben.

Am C64 habe ich das so relativ simpel lösen können..

LDA $#4000 ; Lädt Akkumulator mit Wert aus RAM Adresse 4000 Hex
STA $#DD00 ; Schreibt Akkumulator in D0-D7 des Userports....

Wie bekomme ich nun dieses C Derivat dazu einen Wert aus dem 
RAM/ROM/Flaschspeicher auszulesen und direkt in die Datenregister zu 
Schreiben.

Kann jemand das vielleicht mittels Beispiel erklären.

von Zweifler (Gast)


Lesenswert?


von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wenn Du zuvor schon in Assembler programmiert hast - gibt's hier auch.
Was wo im µC zu finden ist, gibt's im Datenblatt.

C64 - das waren Zeiten (größten Respekt den Leuten, Die Den 
programmieren konnten!!)

... bei mir reichte es nur zum voll-poken des Bildschirm-Speicher - und 
wenn man die Grenzen überschritt, bootete die Kiste einfach neu oder 
fror ein.

Auf dem PC dann unter DOS mit 'debug'
... aber mit ähnlichem 'Erfolg' :)

MfG

von Jim M. (turboj)


Lesenswert?

Was spricht gegen klassische AVR Programmierung in C:
1
const uint8_t dataArray[] = {1,2,3,4};
2
3
DDRA = 0xFF; //alle Pins auf Ausgang
4
PORTA = dataArray[0];

Müsste eigentlich auch unter dem C++ des Arduino tun.
Ansonsten gibt es dafür reichlich Literatur.

von Marco W. (gubelat)


Lesenswert?

Nichts spricht gegen die Verwendung von C, bis auf die Tatsache das ich 
dann wohl einen C Kurs machen muß. 6502 Assembler hatte ich damals ganz 
gut im Griff. Und bei C müste ich von vorne anfangen....

Egal. Der Weg ist das Ziel. Aber ich werde euch bestimmt noch mit 
einigen Fragen nerven müssen :-)

LG Marco

von Wolfgang (Gast)


Lesenswert?

Marco W. schrieb:
> Nichts spricht gegen die Verwendung von C, bis auf die Tatsache das ich
> dann wohl einen C Kurs machen muß. 6502 Assembler hatte ich damals ganz
> gut im Griff. Und bei C müste ich von vorne anfangen....

Dann mach doch ATmega328 Assembler. Was spricht dagegen?
http://www.atmel.com/webdoc/avrassembler/

von Manfred (Gast)


Lesenswert?

Marco W. schrieb:
> 6502 Assembler hatte ich damals ganz
> gut im Griff. Und bei C müste ich von vorne anfangen....
6502 hatte ich auf eigener Hardware als Europakarte, Makroassembler und 
sogar einen Hardware-Emulator dazu ... lange ist's her.

Nach vielen Jahren ohne Prozessor habe ich mir Arduino angetan. Die 
C-Syntax und Semikolon / Klammern kosten einige Nerven, im Endeffekt 
komme ich bei kleinen Dingen aber dennoch schneller ans Ziel als früher.

von Helmut H. (helmuth)


Lesenswert?

Wolfgang schrieb:
> Dann mach doch ATmega328 Assembler.

NB: Mit avrdude können die hex files dann über die USB Schnittstelle und 
den bootloader auf den Arduino geladen werden. Unter win könnte man z.B. 
eine cmd erstellen
avrdude -v -patmega328p -carduino -P\\.\COM6 -b57600 -D -V 
-Uflash:w:C:\pfad\datei.hex:i

von Einer K. (Gast)


Lesenswert?

Der Micro hat doch sicher keinen ATMeg328P drauf, sondern einen 
ATMega32U4

Aber das tut der Sache keinen Abbruch.
C, C++ und Assembler ist leicht möglich mit dem Atmel Studio

Die Arduino IDE möchte C++, kann aber auch, wenn man es geschickt 
anstellt, C und Assembler Dateien kompilieren.
Direkte Register- und Portzugriffe, keine Problem.

Marco W. schrieb:
> Am C64 habe ich das so relativ simpel lösen können..
>
> LDA $#4000 ; Lädt Akkumulator mit Wert aus RAM Adresse 4000 Hex
> STA $#DD00 ; Schreibt Akkumulator in D0-D7 des Userports....
>
> Wie bekomme ich nun dieses C Derivat dazu einen Wert aus dem
> RAM/ROM/Flaschspeicher auszulesen und direkt in die Datenregister zu
> Schreiben.

Arduino:
1
void setzePortdAufOutput()
2
{
3
  const byte data = 0xff; // diese Daten landen im Flash(ROM). 
4
  DDRD = data;    // Register direkt beschreiben, pinMode() vermeiden
5
}

von Markus (Gast)


Lesenswert?

Du könntest auch eine BluePill ( STM32F103 ) zusammen mit der 
Arduino-Umgebung nutzen und dann auf die Register Bare Metal zugreifen.

Das sieht dann so aus
1
// STM32F103 IO register
2
#define GPIOPort_B_ADDRESS 0x40010C00
3
#define GPIOPort_C_ADDRESS 0x40011000
4
#define BSRR_REGISTER_OFFSET 0x10 // port bit set/reset register
5
#define BRR_REGISTER_OFFSET 0x14 // port bit reset register
6
7
void blink()
8
{
9
  *(volatile uint16_t *) (GPIOPort_C_ADDRESS + BSRR_REGISTER_OFFSET) = 1 << 13; // LEDON: write direct into GPIO memory
10
11
  delay(1000);
12
13
  *(volatile uint16_t *) (GPIOPort_C_ADDRESS + BRR_REGISTER_OFFSET)  = 1 << 13; // LEDOFF
14
15
  delay(1000);
16
}

von Cyblord -. (cyblord)


Lesenswert?

Marco W. schrieb:
> Naiv wie ich bin dachte ich besogst du dir ein Arduino Mikro Board.
> Nach der Instalation und dem ersten Wechselblinken von LEDs vermisse ich
> aber doch das direkte programmieren der Hardware.

Also da versteht man die Welt nicht mehr. Du möchtest hardwarenah 
programmieren, aber bügelst dir erst mal das ganze Arduino Zeug drauf 
und dann wird rumgeheult? AVRs bieten jede Möglichkeit in Assembler oder 
in C direkt programmiert zu werden. Ganz wie es beliebt.

von NuMal Halblang (Gast)


Lesenswert?

Cyblord -. schrieb:
> Also da versteht man die Welt nicht mehr.

Er muss ja erst mal Orientierung finden. Das wirst du ihm
schon zugestehen können  dürfen  müssen.

Nur mal so als Beispiel:
Er spricht von einem "C Derivat", das wäre ein spezieller Dialekt
von C, er meint aber wohl die IDE oder den Prozessor.

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.