Hallo.
Ich experimentiere seid einiger Zeit mit dem STK500 und es klappt auch
alles sehr gut soweit. Jetzt bin ich soweit, dass ich etwas fest bauen
möchte ohne STK.
Ich brauche eine Box mit zuerst einem Knopf. Sobald man diesen betätigt,
soll eine Zahl über RS232 gesendet werden. Ein Visual Basic Programm
Wertet dann die Zahl aus und führt eine Entsprechende funktion aus. Bis
jetzt ist nur eine Taste verbaut, soll später aber mehrere hinzukommen.
Bisher wird wenn man PB0 auf Masse zieht die 1 gesendet. Also als Binär
die "49".
Wie gesagt auf dem STK500 kein Ding.
Jetzt hab ich mir ein Atmega8 mit Stecksockel auf eine Platine gelötet.
Spannungsversorgung macht ein 7805 mit nachgeschaltetem 100nF KerKo.
Den MAX232n habe ich wie in dem Tutorial:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART auf die
Platine gelötet. Desweiteren habe ich einen 16Mhz Quarz an XTAL1 und
XTAL2 angeschlossen. Von den beiden Eingängen dann einen 22pF Kerko auf
Masse.
Jetzt ziehe ich den Programmierten Atmega vom STK und steck ihn auf die
Platine. Spannung dran, ComPort dran. Hterm auf. Connect Hterm.
PB0 auf Masse.
Jetzt empfange ich aber "?"ASCII, "FF"Hex, "255"DEC, "11111111"Bin.
Ich habe an der Software etc nichts geändert.
Was mache ich falsch? Wie kann ich weiter vorgehen um den Fehler
einzugrenzen? Kommt der MAX232 mit der Geschwindigkeit nicht klar?
Am Quarz messe ich 0,25V.
Hier noch der verwendete Programmcode:
1 | #include <avr/io.h>
|
2 | #include <stdlib.h>
|
3 | #include <stdint.h>
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 | #define BAUD 9600UL
|
8 | #define UBRR_VAL ((F_CPU + BAUD * 8) / (BAUD * 16) - 1)
|
9 | #define BAUD_REAL (F_CPU / (16 * (UBRR_VAL + 1)))
|
10 | #define BAUD_ERROR ((BAUD_REAL * 1000) / BAUD)
|
11 |
|
12 | #if ((BAUD_ERROR < 990) || (BAUD_ERROR > 1010))
|
13 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
14 | #endif
|
15 |
|
16 | void long_delay(unsigned int ms)
|
17 | {
|
18 | for(; ms > 0; ms--) _delay_ms(1);
|
19 | }
|
20 |
|
21 | void uart_init(void)
|
22 | {
|
23 | UCSRB |= (1<<TXEN) | (1 << RXEN); // UART TX einschalten
|
24 | UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
|
25 |
|
26 | UBRRH = UBRR_VAL >> 8;
|
27 | UBRRL = UBRR_VAL & 0xFF;
|
28 | }
|
29 |
|
30 | /* ATmega16 */
|
31 | int uart_putc(unsigned char c)
|
32 | {
|
33 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
34 | {
|
35 | }
|
36 |
|
37 | UDR = c; /* sende Zeichen */
|
38 | return 0;
|
39 | }
|
40 |
|
41 |
|
42 | /* puts ist unabhaengig vom Controllertyp */
|
43 | void uart_puts (char *s)
|
44 | {
|
45 | while (*s)
|
46 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
|
47 | uart_putc(*s);
|
48 | s++;
|
49 | }
|
50 | }
|
51 |
|
52 | uint8_t uart_getc(void)
|
53 | {
|
54 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
|
55 | ;
|
56 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
|
57 | }
|
58 |
|
59 |
|
60 | int main(void)
|
61 | {
|
62 | uart_init();
|
63 | DDRB = 0x00; /* alle Pins von Port B als Eingang */
|
64 | PORTB = 0xff; /* alle PullUPs von Port B Aktiv */
|
65 | unsigned int aktive = "0";
|
66 | while(1)
|
67 | {
|
68 | if(!(PINB & (1 << PB0)))
|
69 | {
|
70 | if(aktive == "0")
|
71 | {
|
72 | uart_puts("1");
|
73 | aktive = "1";
|
74 | long_delay(1000);
|
75 | }
|
76 | }
|
77 | else
|
78 | {
|
79 | aktive = "0";
|
80 | }
|
81 | }
|
82 | return 0;
|
83 | }
|
Danke schonmal
Grüße Daniel