Hi,
Ich habe mir heute auf einem Steckbrett eine Experimentierschaltung mit
einem Mega32 aufgebaut. Als Programmer benutze ich einen einfachen
Parallelport Programmer und Ponyprog. Das scheint soweit auch zu
funktioniere. Kann den Flash schreiben, auslesen und auch FuseBits
einstellen. Leider bekomme ich es nicht hin eine einfache LED ans
leuchten zu bekommen.
Hier mein Prog.Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/eeprom.h>
|
4 |
|
5 | //CPU Frequenz für Programm auf 1MHz einstellen(interner Takt)
|
6 | #define F_CPU 4000000
|
7 |
|
8 | //Bautrateneinstellung
|
9 | #define BAUD 4800L // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
|
10 | // Berechnungen
|
11 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
12 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
13 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
|
14 |
|
15 | #if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
|
16 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
17 | #endif
|
18 |
|
19 | //***********************
|
20 | typedef unsigned char byte;
|
21 | typedef unsigned int word;
|
22 |
|
23 | typedef struct byte_str{
|
24 | unsigned b0:1;
|
25 | unsigned b1:1;
|
26 | unsigned b2:1;
|
27 | unsigned b3:1;
|
28 | unsigned b4:1;
|
29 | unsigned b5:1;
|
30 | unsigned b6:1;
|
31 | unsigned b7:1;
|
32 | };
|
33 |
|
34 |
|
35 | //***********************
|
36 | void ioinit(void);
|
37 | void delay_ms(unsigned int ms);
|
38 |
|
39 |
|
40 | //***********************
|
41 | // Initialisierung der IO
|
42 | void ioinit(void)
|
43 | {
|
44 |
|
45 | DDRA = 0xff; // PortB als Ausgang deklarieren
|
46 | //PORTB = 0x00; // Ports auf HIGH schalten
|
47 |
|
48 | DDRC = 0xff;
|
49 | PORTC = 0x2A;
|
50 |
|
51 | DDRD = 0xff;
|
52 | PORTD = 0x00;
|
53 |
|
54 | sei(); //Interrupts an
|
55 | //cli(); Interrupts aus
|
56 |
|
57 | }
|
58 | /***********************/
|
59 | //UART Funktionen
|
60 |
|
61 | void aktiviereUART(void)
|
62 | {
|
63 | UCSRB |= (1<<TXEN); // UART TX einschalten
|
64 | UCSRB |= ( 1 << RXEN ); //UART RX einschalten
|
65 | UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1
|
66 | }
|
67 | void uart_write_char(char c)
|
68 | {
|
69 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
70 | {
|
71 | }
|
72 |
|
73 | UDR = c;/* schreibt das Zeichen x auf die Schnittstelle */
|
74 | }
|
75 | void uart_write_String (char *s)
|
76 | {
|
77 | while (*s)
|
78 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
|
79 | uart_write_char(*s);
|
80 | s++;
|
81 | }
|
82 | }
|
83 |
|
84 |
|
85 |
|
86 |
|
87 | //********************
|
88 | //Methoden
|
89 |
|
90 | // Warteschleife
|
91 | void delay_ms(unsigned int ms)
|
92 | {
|
93 | unsigned int zaehler;
|
94 |
|
95 | while (ms) {
|
96 | zaehler = F_CPU / 5000;
|
97 |
|
98 | while (zaehler) {
|
99 | asm volatile("nop");
|
100 | zaehler--;
|
101 | }
|
102 | ms--;
|
103 | }
|
104 | }
|
105 |
|
106 | // Hauptprogramm
|
107 | int main(void) {
|
108 | unsigned char i;
|
109 |
|
110 | ioinit();
|
111 |
|
112 |
|
113 | // Endlosschleife
|
114 | while (1) {
|
115 |
|
116 | PORTD=0xff;
|
117 | PORTA=0x00;
|
118 |
|
119 | }
|
120 |
|
121 | return 0;
|
122 | }
|
Ich habe eine LED mit minus an PD6 über 330Ohm an Vss(5V). Die LED will
aber nicht leuchten.
Ich habe einen Externen Quarz mit 4Mhz angeschlossen. Muss ich das in
den FuseBits irgendwie einstellen das der ext. Quarz genutzt wird?
Welche Bits muss ich in PonyProg setzen? Wie kann ich mir sicher sein,
das der ext. Quarz korrekt arbeitet?
Sebi