Forum: Mikrocontroller und Digitale Elektronik RS-232 mit dem PIC16F84


von Marco G. (marcoglatz)


Lesenswert?

hallo,

so als kleine übung habe ich mir ein 4x4 keypad gebastelt und möchte nun 
per rs-232 je nach gedrückter taset einen code an den pc senden. hab 
bisher den pic über einen max232 an den pc gehängt um erstmal die 
kommunikation hinzubekommen. momentan sende ich einfach in einer 
endlos-schleife alle 'A'.

erstes problem: am pc kommt gar nix an. und was mich auch stutzig macht: 
am tx pin hab ich -13V, müsste das nicht eine positive spannung sein?

zweites problem: ich hab bisher immer noch nicht das mit dem timing 
kapiert. wie wird das mit dem prescaler (oder wie auch immer) berechnet 
damit ich bei 10Mhz auf meine 104µs (1 bit bei 9600 baud) komme?

seit stunden wühle ich mich durch diverse beispiel seiten und komme 
einfach nicht weiter, hoffe hier kann mir einer den nötigen denk anstoß 
geben ;)

gruß,
marco

von AVRuser (Gast)


Lesenswert?

Hallo,

zunächst mal: Der PIC16F84 hat keine (Hardware-) RS232-Schnittstelle. 
D.h., eine solche muss in Software implementiert sein bzw. werden.

Hast du ein fertiges Programm für die Anwendung, oder bist du dabei, 
eins zu erstellen? Welchen Schnittstellen-Baustein verwendest du für den 
PIC (z.B. MAX232 o.ä.)?

> am tx pin hab ich -13V

An welchem Tx? An dem vom PC (bei 9pol-SubD der Pin 3) kann das sein; 
die negative Spannung liegt an, wenn keine Daten gesendet werden. Beim 
Senden von Daten wird bei einer "0" auf positive Spannung (hier ca.+12V) 
umgeschaltet.

von Marco G. (marcoglatz)


Lesenswert?

hallo,

ich verwende wie erwähnt den MAX232.

hab das so angeschlossen:

Sub-D (2) -> (13) MAX232 (12) -> (17) PIC = vom PC empfagen
Sub-D (3) -> (14) MAX232 (11) -> (6) PIC = an PC senden

am Sub-D messe ich nun folgendes:

pin 2 = -13,3V
pin 3 = -3,4V


ich hab mir mit einem embedded-pc einen mp3-player für zuhause gebaut. 
im moment bediene ich das ding per fernbedienung. und da ich von den 
16F84A noch 4 stück hier rumliegen habe dachte ich mir ich bastel damit 
noch ein kleines Keypad, falls mal die batterien leer sind oder die 
fernbedienung irgendwo auf meinem chaos schreibtisch verloren geht.

ich bin gerade dabei mir ein grundgerüst für das programm zu basteln. 
ich verwende den CC5X compiler. die beispiele bzw. anderen projekte die 
ich bisher im netz gefunden habe sind einfach nur kurze schnipsel wie 
man daten sendet. irgend eine initialisierung macht keiner, was mich 
auch stutzig gemacht hat. das der 16F84 kein rs-232 eingebaut hat weiß 
ich ja, von daher bin ich auch ausgegangen das man dem pic erstmal sagen 
muss das ich über ein ausgang daten senden möchte.


gruß,
marco

von AVRuser (Gast)


Lesenswert?

Zum grundsätzlichen Funktionstest der RS232-Verbindung zum PC würde ich 
bei nicht bestücktem PIC die Pins 6 und 17 (also Rxd und TxD) brücken. 
So werden alle eintreffenden Daten über dieses Loopback an den PC 
zurückgesendet.

Wenn das geht, funktioniert schon mal das serielle Interface; nun muss 
man "nur noch" die serielle Datenübertragung im PIC realisieren ...

Mit der Software des PIC kenne ich mich nicht aus (bin ATMEL AVR-User, 
daher der Name ... ).  :-(

Vielleicht gibt es für die Implementation einer seriellen Schnittstelle 
in diesem PIC eine Application Note von Microchip ...

von Marco G. (marcoglatz)


Lesenswert?

oh, danke für den tip mit dem brücken, jetzt hab ich auch nebenbei 
rausgefunden welcher von den zig rs-232 debuggern die ich auf dem pc 
habe funktioniert und welcher nicht ;)

also die buchstaben die ich sende kommen immerhin wieder zurück, also 
tüttelt das ding im grund schon mal.

etwas offtopic nebenbei: die atmel dinger scheinen ja auch recht beliebt 
zu sein, und bei pollin gibts ein board zum selber löten für 15 euro und 
noch ein oder zwei testplatinen zum rumspielen gibts auch noch für 
relativ wenig geld. würde sich so eine investition lohnen. die sache mit 
den microcontrollern fängt so langsam an spaß zu machen und ich denk mir 
wird sicherlich noch das eine oder andere bastel-projekt dazu einfallen.

von Rainer (Gast)


Lesenswert?

Schau mal hier:

http://www.bknd.com/files/serial.txt

Rainer

von Marco G. (marcoglatz)


Lesenswert?

hallo,

so langsam wird die sache immer kurioser:

brücke pin2 <-> pin3 direkt am stecker = daten kommen zurück

brücke pin13 <-> pin14 direkt am max232 = kommt nix zurück.


hab auch mal den MAX232 ausgetauscht, mehrfach die pin-belegung 
überprüft, bringt alles nix.

von Marco G. (marcoglatz)


Lesenswert?

so, nachdem ich mir nun eine controller-karte für den pc gekauft habe 
funktioniert zmindest das lokale echo mit dem max. das die onboard 
schnittstelle nicht ganz propper ist hatte ich mir schon die ganze zeit 
gedacht. und für die schaltung sicherheitshalber einen aktuelleren pic 
mit eingebautem uart bestellt ;)

von AVRuser (Gast)


Lesenswert?

Hallo,

> brücke pin13 <-> pin14 direkt am max232 = kommt nix zurück.

Das geht so nicht; du musst die TTL-Seite brücken! Also Pins 11 und 12.
Wie ich bereits beschrieben hatte (auf der PIC-Seite).

Die Pins 13 und 14 (RS-232 Seite) darfst du nur brücken, wenn der MAX 
nicht bestückt ist, da sein Tx ansonsten die Signale beeinflusst / 
stört.

Die Lösung mit PIC, der einen UART hat, ist sicher die bessere Wahl. Und 
ich gehe davon aus, dass der MAX232 auch o.k. ist.

von Marco G. (marcoglatz)


Lesenswert?

hab heut nochmal die schaltung überprüft und alle datenblätter nochmal 
studiert. dabei hab ich festgestellt das die beispielschaltungen falsch 
waren, dort waren Tx und Rx vom PC kommend vertauscht. nun funktioniert 
die schaltung.

ja, der max ist ok. hab von denen mehrere noch hier und testweise 
ausgetauscht.

allerdings mag mein pic programmer nicht mehr. ist ein jdm programmer 
der bisher mal so mal so funktioniert hat. jetzt bring ich gar nix mehr 
gebrannt, weder mit onboard seriell, usb<->serial converter oder pci 
controller card. ich werd noch wahnsinnig.

von Marco G. (marcoglatz)


Lesenswert?

so, hab heut mein 16F628 bekommen, senden/empfangen über RS-232 
funktioniert einwandfrei. jetzt hab ich das keypad angeschlossen. nur 
hab ich das problem das der auch ohne das ich eine taste drücke einfach 
was an den pc sendet, und je nach taste sendet der auch mal gar nix oder 
einen anderen buchstaben, ich kapier nicht wieso. hier mein programm:

PORTB.3 .... PORTB.6 = Spalte 1-4
PORTA.0 .... PORTA.3 = Zeile 1-4

als compiler verwende ich mikroc weil die ide die libs für usart etc. 
schon mitliefert.
1
void main()
2
{
3
    CMCON = 0x07;   // disable analog
4
    TRISB = 0b00000000;
5
    TRISA = 0b00001111;
6
    TMR0  = 0;
7
8
    USART_init(9600);
9
    Delay_ms(500);
10
    
11
    while (1) {
12
    
13
        // spalte 1
14
        PORTB = 0b00001000;
15
        
16
        Delay_ms(50);
17
18
        if(PORTA.F0 == 1) {
19
            USART_Write('A');
20
            
21
            while(PORTA.F0 == 1) {
22
                Delay_ms(1);
23
            }
24
        
25
        } else if(PORTA.F1 == 1) {
26
            USART_Write('B');
27
            
28
            while(PORTA.F1 == 1) {
29
                Delay_ms(1);
30
            }
31
        
32
        } else if(PORTA.F2 == 1) {
33
            USART_Write('C');
34
            
35
            while(PORTA.F2 == 1) {
36
                Delay_ms(1);
37
            }
38
        
39
        } else if(PORTA.F3 == 1) {
40
            USART_Write('D');
41
            
42
            while(PORTA.F3 == 1) {
43
                Delay_ms(1);
44
            }
45
        }
46
        
47
        // spalte 2
48
        PORTB = 0b00010000;
49
        
50
        Delay_ms(50);
51
52
        if(PORTA.F0 == 1) {
53
            USART_Write('E');
54
            
55
            while(PORTA.F0 == 1) {
56
                Delay_ms(1);
57
            }
58
59
        } else if(PORTA.F1 == 1) {
60
            USART_Write('F');
61
            
62
            while(PORTA.F1 == 1) {
63
                Delay_ms(1);
64
            }
65
66
        } else if(PORTA.F2 == 1) {
67
            USART_Write('G');
68
            
69
            while(PORTA.F2 == 1) {
70
                Delay_ms(1);
71
            }
72
73
        } else if(PORTA.F3 == 1) {
74
            USART_Write('H');
75
76
            while(PORTA.F3 == 1) {
77
                Delay_ms(1);
78
            }
79
        }
80
81
        // spalte 3
82
        PORTB = 0b00100000;
83
        
84
        Delay_ms(50);
85
86
        if(PORTA.F0 == 1) {
87
            USART_Write('I');
88
            
89
            while(PORTA.F0 == 1) {
90
                Delay_ms(1);
91
            }
92
93
        } else if(PORTA.F1 == 1) {
94
            USART_Write('J');
95
            
96
            while(PORTA.F1 == 1) {
97
                Delay_ms(1);
98
            }
99
100
        } else if(PORTA.F2 == 1) {
101
            USART_Write('K');
102
            
103
            while(PORTA.F2 == 1) {
104
                Delay_ms(1);
105
            }
106
107
        } else if(PORTA.F3 == 1) {
108
            USART_Write('L');
109
110
            while(PORTA.F3 == 1) {
111
                Delay_ms(1);
112
            }
113
        }
114
        
115
        // spalte 4
116
        PORTB = 0b01000000;
117
        
118
        Delay_ms(50);
119
        
120
        if(PORTA.F0 == 1) {
121
            USART_Write('M');
122
            
123
            while(PORTA.F0 == 1) {
124
                Delay_ms(1);
125
            }
126
127
        } else if(PORTA.F1 == 1) {
128
            USART_Write('N');
129
            
130
            while(PORTA.F1 == 1) {
131
                Delay_ms(1);
132
            }
133
134
        } else if(PORTA.F2 == 1) {
135
            USART_Write('O');
136
            
137
            while(PORTA.F2 == 1) {
138
                Delay_ms(1);
139
            }
140
141
        } else if(PORTA.F3 == 1) {
142
            USART_Write('P');
143
144
            while(PORTA.F3 == 1) {
145
                Delay_ms(1);
146
            }
147
        }
148
        
149
    }
150
}

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.