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
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.
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
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 ...
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.
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.
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 ;)
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.