Forum: Mikrocontroller und Digitale Elektronik SimulAVR, GDB Programm mit ADC simulieren


von mgolbs (Gast)


Lesenswert?

Hallo,

ich will mein ATMEGA8 Programm nun mal per SimulAVR und GDB unter Debian 
Linux simulieren. Mein Kernproblem ist das Setzen der ADCs bei der 
Simulation. Muss ich die Breakpoint vor
1
ADCSRA |= (1 << ADSC);
 setzen und dann ADCL und ADCH mit Werten füllen? Wenn ja wie macht man 
das im SimulAVR/GDB System?

Gruß und Dank Markus

von mgolbs (Gast)


Lesenswert?

Hallo,

bin jetzt so weit im gdb per
1
set *0x04=0x11
Register setzen zu können. Leider finde ich auch in der iom8.h, für 
ATMega8, keine für mich verständliche Lösung bezüglich IO Register. 
Sollte doch generell auch so funktionieren, oder?
1
/* ADC */
2
#define ADCW    _SFR_IO16(0x04)
3
#ifndef __ASSEMBLER__
4
#define ADC     _SFR_IO16(0x04)
5
#endif
6
#define ADCL    _SFR_IO8(0x04)
7
#define ADCH    _SFR_IO8(0x05)
8
#define ADCSR   _SFR_IO8(0x06)
9
#define ADCSRA  _SFR_IO8(0x06)  /* Changed in 2486H-AVR-09/02 */
10
#define ADMUX   _SFR_IO8(0x07)

Wie kann ich _SFR_IO8(0x05) per set * .... setzen? Muss ich da irgend 
wie einen Offset nutzen wie 0x100000, ...., 0x800000? Über Infos wäre 
ich dankbar.

Gruß Markus

von zitter_ned_aso (Gast)


Lesenswert?

mplab ide läuft auch unter linux und kommt direkt von microship.

vielleicht ausprobieren, als alternative?

von mgolbs (Gast)


Lesenswert?

Hallo,

da könnte ich den avr-gcc C Code 1:1 übernehmen?

"...The AVR GCC Compiler for AVR devices.."

Wobei mir fehlt doch nur ein kleiner Schritt um gdb nutzen zu können. 
Das Paket avr-gcc, SimulAVR und GDB ist im Debian System enthalten, 
schnell installiert, kompakt und über Jahre verfügbar, 2010..., läuft 
auch auf veralteter Hardware und auf alten Distributionen. So bleibt man 
über Jahre entwicklungsfähig. Früher habe ich mit dem Atmel Studio 
teilweise gearbeitet. War mir aber zu groß und zu mächtig. mplab ide 
wird wohl ähnlich geartet sein.

In avr-gcc geht das irgend wie so.
1
sbi((*(volatile uint8_t *)((0x04) + 0x20)), 5);

Laut microchip
1
#define sbi(port,bit) \
2
  (port) |= (1 << (bit)) 
3
Set bit in IO port port.

Das muss man doch irgend wie "umrechnen" können.

Gruß und Dank Markus

von mgolbs (Gast)


Lesenswert?

Hallo,

wieder einen Schritt weiter. Mit
1
(gdb) set *0x0029=0x95
2
(gdb) set *0x0031=0x96
3
(gdb) set *0x0032=0x97

kann ich in die IO-Register [10] PIND, [11] DDRD und [12] PORTD 
schreiben. Habe aber die Logik noch nicht verstanden wann ich in 
Register und wann in IO Register geschrieben wird. Irgend wir wechselt 
das auch mit
1
set *0x800004=0x11

Gruß und Dank Markus

von mgolbs (Gast)


Lesenswert?

Hallo,

habe noch etwas probiert bezüglich möglicher Systematik.
1
>>>> debug Ansatz
2
# Terminal 1
3
# simulavr -g -P simulavr-disp -d atmega8
4
# Terminal 2
5
# avr-gdb oder avr-gdb -tui
6
# (gdb) file ***filename_type.elf
7
# target remote localhost:1212
8
# load
9
# b main
10
# b 56
11
# b 276
12
# c
13
# s
14
# (gdb) set *0x800004=0x73 Register r04 wird auf hex 73 gesetzt
15
# (gdb) set *0x04=0x72 Register r04 wird auf hex 72 gesetzt, aber vorher obriger Befehl
16
# (gdb) set *0x03=0x71 Register r03 wird auf hex 71 gesetzt, aber vorher obriger Befehl, r04 wird dabei 00
17
# (gdb) set *0x800005=0x76 Register r05 wird auf hex 76 gesetzt, aber vorher obriger Befehl, r03 bleibt 71
18
# (gdb) set *0x800030=0x77 IO-Register [10] wird auf hex 77 gesetzt, aber vorher obriger Befehl, Rest bleibt
19
# (gdb) set *0x800038=0x78 IO-Register [18] wird auf hex 78 gesetzt, aber vorher obriger Befehl, Rest bleibt
20
# (gdb) set *0x800040=0x79 keine Veraenderung
21
# (gdb) set *0x800041=0x79 keine Veraenderung
22
# (gdb) set *0x800050=0x79 keine Veränderung
23
# (gdb) set *0x50=0x79 keine Veränderung
24
# (gdb) set *0x800050=0x79 keine Veraenderung
25
# (gdb) set *0x000=0x79 keine Veraenderung
26
# (gdb) set *0x0011=0x79 keine Veraenderung
27
# (gdb) set *0x0010=0x79 keine Veraenderung
28
# (gdb) set *0x800010=0x79 keine Veraenderung
29
# (gdb) set *0x800010=0x02 setzt Register r16 auf hex 02
30
# (gdb) set *0x800010=0x79 setzt Register r16 auf hex 79 was bei gleichem Befehl vorher nicht ging
31
# (gdb) set *0x0010=0x88 setzt Register r16 auf hex 88
32
# (gdb) set *0x00c0=0x83 setzt SRAM Register 00c0 auf hex 83
33
# (gdb) set *0x00b1=0x85 setzt SRAM Register 00b1 auf hex 85
34
# (gdb) set *0x0053=0x89 keine Veraenderung
35
# (gdb) set *0x00af=0x89 setzt SRAM Register 00af auf hex 89

Leider verstehe ich das Verhalten im gbd bezüglich Registern überhaupt 
nicht. Der Adressraum ist für mich nicht zu definieren wann ich Register 
r.. wann IO Register [..] und wann ich SRAM Register 0x.... mit dem set 
*0x.. 0anspreche. Auch was ich mit dem set *0x8..... bewirke. Hat da 
jemand eine Info?


Bezüglich mplab habe ich es mir installiert, kann aber keine gcc 
Projekte, Code davon nutzen, findet keinen Compiler unter /usr/bin/.

Gruß und Dank Markus

von mgolbs (Gast)


Lesenswert?

Hallo,

werde jetzt mal simavr probieren. Habe als erstes unter Debian gtkwave, 
libelf-dev, freeglut3-dev und elfutils installiert. Verstehe auch hier 
noch nicht wie das simavr zu konfigurieren ist, auch bezüglich gdb 
Anbindung aber die Grafik des Testssystems in gtkwave sieht 
vielversprechend aus. Eventuell komme ich damit weiter.

Gruß Markus

von Alexander S. (alesi)


Lesenswert?

mgolbs schrieb:
> Habe aber die Logik noch nicht verstanden wann ich in
> Register und wann in IO Register geschrieben wird.

Hallo Markus,

die 32 Register r00 bis r31 haben im Datenbereich die Adressen $00 bis 
$1F.
Die 64 I/O-Register die Adressen $20 bis $5F. Bei den Befehlen, die auf 
I/O-Register wirken, beginnen die Adressen der I/O-Register bei $00, um 
Bits zu sparen.
Daher entsprechen
1
 PIND $10 -> $30 (nicht $29 wie bei Dir oben)
2
 DDRD $11 -> $31
3
PORTD $12 -> $32
Siehe die erste Spalte in der Register Summary im Datenblatt auf S. 309.

von zitter_ned_aso (Gast)


Angehängte Dateien:

Lesenswert?

mgolbs schrieb:
> Bezüglich mplab habe ich es mir installiert, kann aber keine gcc
> Projekte, Code davon nutzen, findet keinen Compiler unter /usr/bin/.

kann ich auch nicht. Alles was mit ubuntu kam und in 
/usr/bin-Verzeichnis liegt, wird auch bei mir nicht akzeptiert. Keine 
Ahnung warum.

Diese IDE ist ja noch beta, vielleicht ändert sich das noch.

Ich habe die gcc-avr-toolchain von (ihrer?) Webseite runtergeladen und 
damit gehts. Siehe Foto im Anhang. Ich habe nicht mehr im Kopf wo ich 
sie her habe.


Und diese toolchain kann ich dann beim Erzeugen eines neuen Projekts 
auswählen. Zusätzlich zu dem xc8-Compiler. Alles aus "usr/bin" bleibt 
weiterhin rot, wie bei dir.


(hinzugefügt wird das ganze über tools -> options -> embedded -> build 
tools. Dort dann mit dem "add"-Button das neue Verzeichins auswählen 
(und z.B. als "default" markieren).


Was den xc8-Compiler angeht, dann hast du da bestimmt auch die Version 
2.00. Es gibt dafür mittlerweile eine neuere Version 2.05

"....Thanks for taking a look and commenting. The v2.05 compiler will 
have a few neat new features, and moving forward, the AVR compiler 
inside XC8 will continue to develop...."

Letzter Kommentar auf: https://www.microchip.com/forums/m1070554.aspx

Vielleicht reicht dir erst mal dieser Compiler.

von zitter_ned_aso (Gast)


Lesenswert?

zitter_ned_aso schrieb:
> Ich habe die gcc-avr-toolchain von (ihrer?) Webseite runtergeladen und
> damit gehts. Siehe Foto im Anhang. Ich habe nicht mehr im Kopf wo ich
> sie her habe.

vermutlich von hier:

https://www.microchip.com/mplab/avr-support/avr-and-arm-toolchains-c-compilers

(aber die Links scheinen momentan nicht zu funktionieren)

von mgolbs (Gast)


Lesenswert?

Hallo,

vielen Dank für die Informationen. Ich habe damit noch mal neu begonnen.
1
(gdb) set *0x00=0x17
2
(gdb) set *0x20=0x17

Mit diesen zwei Befehlen müsste ich doch eigentlich das erste Register 
r00 sowie das erste IO Register jeweils auf hex 17 gesetzt haben. Der 
Befehl wird ohne Fehlermeldung angenommen, die Registerinhalte bleiben 
aber weiterhin auf Startwert 00.

Erst ein
1
(gdb) set *0x800000=0x17

setzt das Register r00 auf hex 17. Der Befehl
1
(gdb) set *0x800020=0x17
sollte dann doch auch IO Register [00] auf hex 17 setzen, tut er leider 
nicht.
1
(gdb) set *0x800000=0x17
2
(gdb) set *0x800020=0x17
3
(gdb) set *0x800028=0x17
4
(gdb) set *0x800030=0x17
5
(gdb) set *0x800021=0x17
6
(gdb) set *0x800022=0x17
7
(gdb) set *0x800023=0x17
8
(gdb) set *0x800024=0x17
9
(gdb) set *0x800025=0x17
10
(gdb) set *0x800026=0x17
11
(gdb) set *0x800027=0x17
12
(gdb) set *0x800028=0x17
13
(gdb) set *0x800029=0x17
14
(gdb) set *0x80002a=0x18
15
(gdb) set *0x80002b=0x18
16
(gdb) set *0x80002c=0x18
17
(gdb) set *0x80002d=0x18
18
(gdb) set *0x80002e=0x18
19
(gdb) set *0x80002f=0x18

Auch alle diese IO-Register, [00]...[0f] lassen sich nicht ändern.
1
(gdb) set *0x20=0x17
2
(gdb) set *0x2f=0x17

Ebenfalls negativ. Erst [10] lässt sich per set setzen.
1
(gdb) set *0x30=0x17

Auch
1
(gdb) set *0x31=0x17
2
(gdb) set *0x32=0x17
3
(gdb) set *0x33=0x17
4
(gdb) set *0x34=0x17
5
(gdb) set *0x35=0x17
6
(gdb) set *0x36=0x17
7
(gdb) set *0x37=0x17
8
(gdb) set *0x38=0x17
sind änderbar.

Ab
1
(gdb) set *0x39=0x17

wieder keine Änderungsmöglichkeit. Nur
1
(gdb) set *0x5f=0x17
2
(gdb) set *0x5e=0x17
3
(gdb) set *0x5d=0x17

sind änderbar. Warum ist das so? Warum muss ich am Anfang den offset 
*0x800000 machen? Wie muss ich set benutzen um den SRAM zu ändern?

Gruß und Dank Markus

von mgolbs (Gast)


Lesenswert?

Hallo,

hier noch der Auszug aus dem simulavr -g -P simulavr-disp -d atmega8
1
golbs@debian-net-amd:~/Atmel/2019-04-08-ATMega8P$ simulavr -g -P simulavr-disp -d atmega8
2
3
Simulating a atmega8 device.
4
5
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWBR' at 0x0020
6
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWSR' at 0x0021
7
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWAR' at 0x0022
8
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWDR' at 0x0023
9
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADCL' at 0x0024
10
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADCH' at 0x0025
11
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADCSRA' at 0x0026
12
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ADMUX' at 0x0027
13
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ACSR' at 0x0028
14
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UBRRL' at 0x0029
15
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UCSRB' at 0x002a
16
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UCSRA' at 0x002b
17
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UDR' at 0x002c
18
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPCR' at 0x002d
19
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPSR' at 0x002e
20
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPDR' at 0x002f
21
devsupp.c:332: MESSAGE: attach: IO Reg 'PIND' at 0x0030: created
22
devsupp.c:316: MESSAGE: attach: IO Reg 'DDRD' at 0x0031: ref = 0x0030
23
devsupp.c:316: MESSAGE: attach: IO Reg 'PORTD' at 0x0032: ref = 0x0030
24
devsupp.c:332: MESSAGE: attach: IO Reg 'PINC' at 0x0033: created
25
devsupp.c:316: MESSAGE: attach: IO Reg 'DDRC' at 0x0034: ref = 0x0033
26
devsupp.c:316: MESSAGE: attach: IO Reg 'PORTC' at 0x0035: ref = 0x0033
27
devsupp.c:332: MESSAGE: attach: IO Reg 'PINB' at 0x0036: created
28
devsupp.c:316: MESSAGE: attach: IO Reg 'DDRB' at 0x0037: ref = 0x0036
29
devsupp.c:316: MESSAGE: attach: IO Reg 'PORTB' at 0x0038: ref = 0x0036
30
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'UBRRH' at 0x0040
31
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'WDTCR' at 0x0041
32
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ASSR' at 0x0042
33
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR2' at 0x0043
34
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT2' at 0x0044
35
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR2' at 0x0045
36
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ICR1L' at 0x0046
37
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'ICR1H' at 0x0047
38
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1BL' at 0x0048
39
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1BH' at 0x0049
40
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1AL' at 0x004a
41
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OCR1AH' at 0x004b
42
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT1L' at 0x004c
43
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT1H' at 0x004d
44
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR1B' at 0x004e
45
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR1A' at 0x004f
46
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SFIOR' at 0x0050
47
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'OSCCAL' at 0x0051
48
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCNT0' at 0x0052
49
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TCCR0' at 0x0053
50
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'MCUCSR' at 0x0054
51
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'MCUCR' at 0x0055
52
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TWCR' at 0x0056
53
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'SPMCR' at 0x0057
54
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TIFR' at 0x0058
55
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'TIMSK' at 0x0059
56
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'GIFR' at 0x005a
57
devsupp.c:338: MESSAGE: TODO: attach IO Reg 'GICR' at 0x005b
58
devsupp.c:332: MESSAGE: attach: IO Reg 'SPL' at 0x005d: created
59
devsupp.c:316: MESSAGE: attach: IO Reg 'SPH' at 0x005e: ref = 0x005d
60
devsupp.c:332: MESSAGE: attach: IO Reg 'SREG' at 0x005f: created
61
avrcore.c:475: MESSAGE: attach: Internal SRAM from 0x0060 to 0x045f
62
decoder.c:3875: MESSAGE: generating opcode lookup_table
63
main.c:415: MESSAGE: Simulating clock frequency of 8000000 Hz
64
Waiting on port 1212 for gdb client to connect...

Gruß Markus

von mgolbs (Gast)


Lesenswert?

Hallo,

die 0x800000 scheinen aus der Makefile Definition zu kommen.
1
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
2
COFFCONVERT=$(OBJCOPY) --debugging \
3
--change-section-address .data-0x800000 \
4
--change-section-address .bss-0x800000 \
5
--change-section-address .noinit-0x800000 \
6
--change-section-address .eeprom-0x810000

Gruß Markus

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.