Hallo Forum, ich muss zum ersten mal nun einen Atmega8A selber programmieren.. Bisher nur PIC oder eigentlich nur Linux.. Nun mein Problem: 1. Ich hab den Code mit MPLABx geschrieben und wollte das dann mit meinem USBASP flashen.. Schonmal blöd das MPLAB die fuses mit ins Hex reinschreibt und avrdude / usbasp das nicht kann. 2. MPLABX unterstützt kein USBASP hätte noch ein SNAP hier aber das USBASP kann ich direkt aufstecken das SNAP nicht.. 3. Habe nun die Fuses in MPLABX auskommentiert und kann nun auch mit avrdude & USBASP das hex flashen und habe die Fuses dann noch seperat gesetzt.. Aufgerufener Befehl: sudo avrdude -cusbasp -U flash:w:GPSDO.X.production.hex -U lfuse:w:0xBF:m -U hfuse:w:0xC9:m -U lock:w:0xFF:m -pm8 Zur Hardware: Es ist ein Atmega8A in einem BG7TBL GPSDO in dem ich das Fake Chine GPS Modul gegen ein original NEO-9N getauscht habe und daher nun den Atmega8 ebenfalls tauschen und neu programmieren muss. Der original war gelocked und die Sourcen sind ebenfalls nicht verfügbar. Da das NEO-9N aber mehr als 9600Baud reden möchte und ich die Konfiguration des GPS Moduls direkt in dessen Flash gespeichert habe muss der Atmega8A nur Housekeeping machen (LED an/aus, GPS Modul an/aus und ich muss Ihm nun noch beibringen rauszufinden wann der GPSDO gefixed ist (GPS + 10MHz..)) Wen es noch mehr interessiert hier: https://www.eevblog.com/forum/testgear/new-gpsdo-bg7tbl/75/ Weiß noch nciht so ganz wie ich den "fix" erkenne. Den GPS muss ich über die UART "erkennen" sagt mir ja das Modul. Und die 10MHz irgendwie über die Spannungsänderung des OCXO Steuerspannung. Ggf. kann man noch irgnedwas anderes machen. Der geteilte OCXO Takt wird auf den EXTCLK Pin des Atmega gegeben. Ggf. bekommt man das irgendwie über die Baudrate vom GPS Modul oder da die NMEA Ausgaben noch genauer hin. Verstehe noch nciht so ganz wie man es möglichst genau erkennt wenn die 10MHz gefixed sind. Aber nun mein eigentliches Problem: Der Atmega8 läuft mit einem 11.0592MHz Quarz. Das habe ich im Code auch so vermerkt (und hoffentlich die Fuses richtig gesetzt.., übrigens wie kann man die zurücksetzten? Nur HV, ziemlich blöd das ist bei den PICS besser..?) Mein Code ist unten gezeigt. Da Problem ist nun das ich ja erwarten würde das er beim Delay 10s an/ 10s aus macht. Es sind aber mit den 10000 eher nur 1s. Hab es andersrum probiert also delay 1000 aber das ist deutlich schneller als 1s.. Was ist da los? Stimmt mein F_CPU nicht? Oder sonstwas?
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <avr/io.h> |
4 | #include <util/delay.h> |
5 | |
6 | #define F_CPU 11059200UL
|
7 | |
8 | //FUSES = {
|
9 | // .low = 0xBF, // LOW {SUT_CKSEL=EXTHIFXTALRES_16KCK_64MS, BODEN=SET, BODLEVEL=2V7}
|
10 | // .high = 0xC9, // HIGH {BOOTRST=CLEAR, BOOTSZ=1024W_0C00, EESAVE=CLEAR, CKOPT=SET, SPIEN=SET, WDTON=CLEAR, RSTDISBL=CLEAR}
|
11 | //};
|
12 | |
13 | //LOCKBITS = 0xFF; // {LB=NO_LOCK, BLB0=NO_LOCK, BLB1=NO_LOCK}
|
14 | |
15 | void ioinit(void); |
16 | void uartinit(void); |
17 | void adcinit(void); |
18 | void interruptinit(void); |
19 | void fixled_on(void); |
20 | void fixled_off(void); |
21 | void statled_on(void); |
22 | void statled_off(void); |
23 | void gps_on(void); |
24 | void gps_off(void); |
25 | |
26 | /*
|
27 | *
|
28 | */
|
29 | int main(void) { |
30 | unsigned int adc_value = 0; |
31 | unsigned int adc_value_last = 0; |
32 | unsigned char gpsfixed = 0; |
33 | ioinit(); |
34 | gps_on(); |
35 | statled_on(); |
36 | while(1) |
37 | {
|
38 | fixled_on(); |
39 | _delay_ms(10000); |
40 | fixled_off(); |
41 | _delay_ms(10000); |
42 | }
|
43 | }
|
44 | |
45 | void ioinit (void) |
46 | {
|
47 | DDRC = 0b00111000; |
48 | PORTC = 0b11000111; |
49 | }
|
50 | void adcinit (void) |
51 | {
|
52 | DDRC = 0b00111000; |
53 | PORTC = 0b11000111; |
54 | }
|
55 | void fixled_on(void) |
56 | {
|
57 | PORTC |= _BV(PC3); |
58 | }
|
59 | void fixled_off(void) |
60 | {
|
61 | PORTC &= ~_BV(PC3); |
62 | }
|
63 | void statled_on(void) |
64 | {
|
65 | PORTC |= _BV(PC4); |
66 | }
|
67 | void statled_off(void) |
68 | {
|
69 | PORTC &= ~_BV(PC4); |
70 | }
|
71 | void gps_on(void) |
72 | {
|
73 | PORTC |= _BV(PC5); |
74 | }
|
75 | void gps_off(void) |
76 | {
|
77 | PORTC &= ~_BV(PC5); |
78 | }
|