Forum: Mikrocontroller und Digitale Elektronik Atmega8A 1000ms != 1s ?


von No Y. (noy)


Lesenswert?

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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

No Y. schrieb:

> 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?

Die meisten kannst du einfach so neu programmieren.

Nur, wenn du dir die Fuse setzt, mit denen du den Reset-Pin abklemmst 
(dann kannst du ihn als GPIO benutzen), dann geht danach natürlich kein 
ISP mehr.

> #include <util/delay.h>
>
> #define F_CPU 11059200UL

Dafür solltest du eine Warnung bekommen, und zwar die, dass F_CPU nicht 
gesetzt ist in dem Moment, wo <util/delay.h> eingebunden wird. Die 
Reihenfolge hier ist schlicht falsch herum.

Da allerdings der voreingestellte Wert ein Takt von 1 MHz ist, würde ich 
erwarten, dass die Delay um den Faktor 10 zu langsam sind statt zu 
schnell …

von No Y. (noy)


Lesenswert?

Ha stimmt..
Kam sogar eine Warnung aber hatte die "überlesen".
Reihenfolge geändert und es passt.

Danke.

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.