Hallo,
Mein Atxmega128 macht mich schön langsam fertig...
Ich habe ein selbst gebauts Board, das einen Atxmega128 besitzt. Als
Taktquelle benutze ich einen externen Quarz 16MHz.
Nun möchte ich einfach an einem Port 0x00 ausgeben. Aber ich messe
ständig am PIN0 high (3.2V) -> also 0x01
Wenn ich mich mit dem Debugger dranhänge sehe ich, dass im OUT Register
0x00 steht und im IN Register 0x01. wenn ich dann über den Debugger das
IN Register auf 0x00 stelle, dann messe ich am PIN auch logisch 0.
So nun verstehe ich aber nicht warum ständig im IN Register des Ports
0x01 steht. Ich mache ja gar nichts mit dem IN Register.
Meine Vermutung ist jetzt folgende...
Ich denke, dass es mit der Config für den externen Quarz zu tun hat.
Weil wenn ich dieses Programm mit dem AVR Simulator laufen lasse
funktioniert es. Im OUT steht klarerweise 0x00 und im IN auch.
Hier kurz mein Code:
1 | #define F_CPU 16000000UL /* 16 MHz CPU clock */
|
2 |
|
3 | #include <util/delay.h>
|
4 | #include <avr/io.h>
|
5 | //#include "ethernet.h"
|
6 |
|
7 | int main(void) {
|
8 |
|
9 | OSC.XOSCCTRL |= (1<<OSC_FRQRANGE0_bp) | (1<<OSC_FRQRANGE1_bp); //Frequency Range 12-16 MHz
|
10 | OSC.XOSCCTRL |= (1<<OSC_XOSCSEL0_bp)| (1<<OSC_XOSCSEL1_bp); //0,4 - 16Mhz XTAL 256CLK
|
11 |
|
12 | OSC.CTRL |= (1<<OSC_XOSCEN_bp); //extern Oszillator enable
|
13 | for(;(OSC_STATUS & (1<<OSC_XOSCRDY_bp)) == 0;); //warten bis Quarz ready
|
14 | OSC.PLLCTRL |= (1<<OSC_PLLSRC0_bp) | (1<<OSC_PLLSRC1_bp); //Clock Source
|
15 | CCP = 0xD8;
|
16 | CLK.CTRL = 0x03;
|
17 | OSC.CTRL &= ~(1<<OSC_RC2MEN_bp); //Disable 2MHz internal RC
|
18 |
|
19 | PORTJ.DIR = 0xFF;
|
20 | PORTJ.OUT = 0x00;
|
21 |
|
22 | while(1) {
|
23 | }
|
24 |
|
25 | return (0);
|
26 | }
|
Weiß vielleicht jemand wo hier das Problem liegt??
Vielen Dank!