Hallo zusammen,
ich sitze zur Zeit dabei, meinen Rechner so einzurichten, dass ich uCs
mit einem Arduino Uno als ISP flashen kann. Dazu nutze ich zum Testen
einen Atmega168. avr-gcc und avrdude läuft. Noch nutze ich notepad++ und
cmd (Win10) zum proggen, bei Zeiten werde ich eine IDE einrichten.
Typischer erster Versuch: LED blinken lassen, bzw. erst einmal
einschalten. Mithilfe der avr/io.h funktioniert's auch prima, mit
direkten Registerzugriffen über selbstdefinierte Zeiger aber nicht. Ich
möchte aber gerne, dass das auch klappt.
Mein Code sieht wie folgt aus:
1 | //#define __AVR_ATmega168A__
|
2 |
|
3 | #include <stdint.h>
|
4 |
|
5 | volatile uint8_t *DDRB_p = (uint8_t*)0x24; //Pointer to DDRB: Direction
|
6 | volatile uint8_t *PORTB_p = (uint8_t*)0x25; //Pointer to PORRTB; DATA
|
7 |
|
8 | int main(){
|
9 |
|
10 | *DDRB_p = 0xFF; //set output
|
11 |
|
12 | while(1) {
|
13 | *PORTB_p |= (1<<1); //set Bit
|
14 | }
|
15 | return 0;
|
16 | }
|
Mein erstmal minimalistisches Makefile:
1 | #MAKEFILE
|
2 |
|
3 | all: test.o
|
4 | #avr-gcc -o -mmcu=atmega168a test test.o | DOESNT WORK
|
5 | avr-gcc -o test test.o
|
6 | avr-objcopy -O ihex test.o test.hex
|
7 | avrdude -c avrisp -p atmega168 -P COM4 -b 19200 -U flash:w:test.hex
|
8 |
|
9 |
|
10 | %.o: %.c
|
11 | avr-gcc -c $<
|
12 |
|
13 | clean:
|
14 | rm -f test.o test.hex test
|
Kann mir jemand sagen, was ich falsch mache? Die Registeradressen stehen
so im Datenblatt. Zusätzlich habe ich die avr/io.h und die
avr/sfr_defs.h nachverfolgt und komme auf die gleichen Adressen.
Gruß