Hallo zusammen,
ich habe die Funktionen aus der stdlib.h wie z.B. utoa(), itoa() oder
ltoa() auf verschienenen Megas immer ohne Probleme anwenden können. Beim
Xmega32A4 funktioniert es aber überhaupt nicht.
Der Controller gibt mit angehängtem Code überhaupt nichts aus, reagiert
aber auf einen USART-Interrupt (sendet das empfangene Zeichen zurück,
siehe ISR).
Wenn ich den Code im Simulator laufen lasse und die Funktion utoa()
aufgerufen wird, springt er zu einer völlig anderen Stelle im Code (und
zwar ans Ende der adc_getchan() Funktion).
Wo liegt hier das Problem? Und warum geht es mit den Megas, mit dem
Xmega aber nicht?
Noch ne andere Frage: wo kann ich mir den Code der Funktion utoa()
ansehen? In stdlib.h steht ja nur der Prototyp.
1 | #include <avr/io.h>
|
2 | #include <stdlib.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <util/delay.h>
|
5 | #include "usart.h"
|
6 | #include "sd_card.h"
|
7 | #include "lcd_n6100.h"
|
8 | #include "adc.h"
|
9 |
|
10 |
|
11 | void clk_config(void) {
|
12 | PORTE.DIRCLR = PIN1_bm; // Layout Fehler!!!
|
13 | PORTE.OUTCLR = PIN1_bm; // PE1 fest auf GND!!!
|
14 | // 16Mhz crystal, 256CKL startup
|
15 | OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_256CLK_gc;
|
16 | // enable external oscillator
|
17 | OSC.CTRL = OSC_XOSCEN_bm;
|
18 | // PLL-Source = external crystal, PLL Factor = 2
|
19 | OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 2;
|
20 | while(!(OSC.STATUS & OSC_XOSCRDY_bm)); //Crystal Ready
|
21 | // enable PLL
|
22 | OSC.CTRL |= OSC_PLLEN_bm;
|
23 | while(!(OSC.STATUS & OSC_PLLRDY_bm)); //PLL Ready
|
24 | CLK.PSCTRL = 0x00; // No Prescalers
|
25 | CCP = 0xD8;
|
26 | // Clock Source = PLL
|
27 | CLK.CTRL = CLK_SCLKSEL_PLL_gc;
|
28 | }
|
29 |
|
30 |
|
31 |
|
32 | int main(void) {
|
33 |
|
34 | clk_config();
|
35 |
|
36 | sei();
|
37 | PMIC.CTRL |= PMIC_HILVLEN_bm; // enable high level interrupts
|
38 |
|
39 | usartC0_init();
|
40 |
|
41 | _delay_ms(500);
|
42 |
|
43 | unsigned int wert = 0;
|
44 | char s[5];
|
45 |
|
46 |
|
47 | while(1) {
|
48 |
|
49 | wert = adc_getchan();
|
50 | usartC0_putc(wert);
|
51 | usartC0_puts(utoa(wert, s, 10));
|
52 | usartC0_putc(' ');
|
53 |
|
54 | _delay_ms(1000);
|
55 | }
|
56 | }
|
57 |
|
58 |
|
59 | ISR(USARTC0_RXC_vect) {
|
60 | unsigned char tmp = USARTC0.DATA;
|
61 | usartC0_putc(tmp);
|
62 |
|
63 | lcd_shutdown();
|
64 | }
|
mfg Markus