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.
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
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.
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
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/
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.
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
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 | }
|
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 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.