Hallo, wir haben derzeit ein Schulprojekt am laufen und müssen es morgen abgeben! Unser Problem ist die Kommunikation zwischen der Seriellen Schnittstelle und den µC. Wir verwenden einen Max3232 und einen PIC18F4550. Es werden Buchstaben vom Notebook über die serielle Schnittstelle gesendet, der Max empfängt diese auch richtig, doch er invertiert diese. So jetzt brauch ich euch und zwar wir haben zwei Varianten versucht: 1. µC Eingang negieren (nicht geklappt oder falsch gemacht) char negieren; negieren=~ReadUSART; 2. Es wird über LabView genutzt und dort wurden sie negiert und dann erst gesendet, also sollten am µC wieder die richtigen Zeichen sein, doch das ist nicht so. Wir haben auch schon an ein NOT-Gatter gedacht doch diese Lösung wäre die umständlichste da die Schaltung auf einer geätzten Platine ist. Neuestens hab ich den PIC so programmiert, dass wenn irgendetwas ankommt dann sollen alle LEDs leuchten. Zeitweise funktioniert es. Danke im Voraus Mfg Domi PS: Zur Verständnis, ein Buchstabe bedeutet eine LED.
Normalerweise wird keine Negation (nirgends) gebraucht, wenn man Daten über die serielle Schnittstelle übertragen will. Der MAX negiert, ok, aber auf der PC-Seite ist wieder ein MAX und auch der negiert, dann passt es wieder. Habt Ihr auch GND am seriellen Anschluss angeschlossen? (weil nicht eingezeichnet...)
Dominik schrieb: > Hallo, > wir haben derzeit ein Schulprojekt am laufen und müssen es morgen > abgeben! > Unser Problem ist die Kommunikation zwischen der Seriellen Schnittstelle > und den µC. Wir verwenden einen Max3232 und einen PIC18F4550. > Es werden Buchstaben vom Notebook über die serielle Schnittstelle > gesendet, der Max empfängt diese auch richtig, doch er invertiert diese. Und das ist auch richtig so. Denn der MAX macht nur das rückgängig, was im Notbook bereits mit den Zeichen gemacht wurde. Denn dort sitzt (im Prinzip) ebenfalls ein MAX232. 2 mal invertiert gibt aber wieder alles richtig rum. Im Notbook (vor dem ersten MAX) und im µC (nach dem zweiten Max) herrschen jeweils dieselben Pegel. Auf dem Kabel jedoch ist genau alles verkehrt rum und die Spannungslage ist auch eine andere (-12V und +12V anstelle von 5V und 0V). Das ist aber nur am Kabel so. Der MAX im Notebook setzt PC-seitig die Daten entsprechend um und der MAX im µC macht es wieder rückgängig. Nichts von all euren Negier-Versuchen ist notwendig (oder richtig). Euer Problem liegt woanders. Ihr bellt den falschen Baum an.
:
Bearbeitet durch User
such mal im Datenblatt nach: RXDTP: Received Data Polarity Select bit TXCKP: Clock and Data Polarity Select bit ist auf der Seite 242.
Dominik schrieb: > wir haben derzeit ein Schulprojekt am laufen und müssen es morgen > abgeben! Na da seid Ihr ja nicht zu früh dran. Mess erstmal direkt auf Rx & TX (mit einem Oszilloskop) ob da überhaupt was passiert. Die Pegel sollten so um und bei +10V und -10V sein. http://de.wikipedia.org/wiki/RS-232 Stimmt Deine Pinbelegung ? Geht PC-TX auf PIC-RX und umgekehrt ? Hast Du den GND auf beiden Seiten angeschlossen ? Sende auch vom PIC aus was und schau Dir das Signal an. Vergleiche die Zeiten der Signalpegel um einen Eindruck davon zu bekommen ob beide mit gleicher Baudrate senden. Wenn das soweit stimmt dann gibt es schon mal eine prinzipiell richtige Übertragung. Bleiben noch genug andere Möglichkeiten was falsch zu machen.
Läuft eure Übertragung mittlerweile schon? Wo seid ihr denn? Vielleicht kann auf die Schnelle heute Abend noch jemand vor Ort mit drauf schauen? Soll euer Projekt noch mehr machen, als die Zeichen zu übertragen bzw. was soll euer Projekt denn insgesamt überhaupt machen?
Hallo also ich bin mit von der Truppe die das Projekt machen. Martin Maurer schrieb: > Läuft eure Übertragung mittlerweile schon? > Wo seid ihr denn? Vielleicht kann auf die Schnelle > heute Abend noch jemand vor Ort mit drauf schauen? Übertragung, also wir können zeitweise etwas senden, nur sind das irgendwelche zeichen. Das mit dem Draufschauen wird glaub ich nichts, also wir sind von Österreich (Niederösterreich) aus dem Bezirk Mistelbach. > Soll euer Projekt noch mehr machen, als die Zeichen zu übertragen > bzw. was soll euer Projekt denn insgesamt überhaupt machen? Ja also wir machen eine LED-Matrix, diese wird mittels LABView und den Mikrocontroller angesteuert. d.h. LabView sendet für jede LED eine anderen Buchstaben über die serielle Schnittstelle an den µController und dieser schaltet dann die Ledtreiber durch. LG Laungaa
Michael Knoelke schrieb: > Na da seid Ihr ja nicht zu früh dran. > Mess erstmal direkt auf Rx & TX (mit einem Oszilloskop) ob da überhaupt > was passiert. Die Pegel sollten so um und bei +10V und -10V sein. > > http://de.wikipedia.org/wiki/RS-232 > Stimmt Deine Pinbelegung ? > Geht PC-TX auf PIC-RX und umgekehrt ? > Hast Du den GND auf beiden Seiten angeschlossen ? > > Sende auch vom PIC aus was und schau Dir das Signal an. > Vergleiche die Zeiten der Signalpegel um einen Eindruck davon zu > bekommen ob beide mit gleicher Baudrate senden. > > Wenn das soweit stimmt dann gibt es schon mal eine prinzipiell richtige > Übertragung. Bleiben noch genug andere Möglichkeiten was falsch zu > machen. Wir haben schon alles in den Bereich von Serieller SChnittstelle bis zum µC durchgemessen, das funktioniert überall. Wir haben dann den Binärcode mittels Ozilloskop ausgelesen Wir haben mit einem hyperterminal ein a gesendet dann war vor dem Max der binärcode des a's vorhanden, also 01100001 und hinter dem Max war es ein komischen z also 1001110 daher dachten wir wir müssen es invertieren.
>Wir haben mit einem hyperterminal ein a gesendet dann war vor dem Max >der binärcode des a's vorhanden, Wie sieht die serielle Schnittstelle eures PCs aus? Ein USB-Seriell TTL Wandler? Dann braucht ihr den MAX nicht.
holger schrieb: > > Wie sieht die serielle Schnittstelle eures PCs aus? > Ein USB-Seriell TTL Wandler? Dann braucht ihr den MAX nicht. ein RS232 also D-Sub 9PIN
Habt Ihr ein Voltmeter? Messt doch mal sämtliche Spannung aus, die an den Kondensatoren des MAX sind und schreibt diese hier! Ihr habt die Kondensatoren wie im Datenblatt angeschlossen und auch ähnliche Größe? Und richtig herum? Ausreichende Spannung der Kondensatoren? Habt Ihr das LabView-Programm selbst geschrieben? Vielleicht mal hier rein stellen? (Ich hab noch nie LabView benutzt, noch programmiert...) Oder vielleicht mal ein Terminal-Programm statt LabView benutzen? Welche Baudrate benutzt ihr? 8N1? Die Negier-Sachen sind jetzt überall draußen? Oder statt dem uC einen zweiten seriellen Port (gleicher oder anderer PC) anschließen (GND1 <-> GND2, RX1 <-> TX2, RX2 <-> TX1) und schauen, ob die gesendeten Zeichen dort ankommen. Ist es ein 32 Bit Windows oder 64 Bit? Falls 32 Bit, könnte Portmon weiterhelfen... Kann man bei Labview zyklisch Zeichen senden, z.B. jede Sekunde ein 'a'. Dann mit dem Oszi eine Aufnahme machen? 2-Kanal-Oszi? Dann auf je einem Kanal einmal vor dem MAX und einmal dahinter. Dann müsste man sehen, wie sich die Bits verändern (in eurem Fall von 'a' nach komischem 'z').
Schaumal was ich für euch gefunden habe....Scheint ein Problem mit dem PIC zu sein.... Hier ein Auszug Using the PIC24 with BRGH = 1 is a problem and you will find many occurances of this problem here in the forum. Whether this problem is the one you are seeing depends on the silicon revision of your chip, see the errata http://ww1.microchip.com/downloads/en/DeviceDoc/80471a.pdf . The only sure fire way to get around it if you have one of the affected revisions is to stick with BRGH = 0. Hope this helps, Nachdem BRGH = 0 gesetzt wurde hatte es geklappt....Er hatte genau die gleichen probleme wie ihr. http://www.microchip.com/forums/m451419-print.aspx
Martin Maurer schrieb: > Habt Ihr ein Voltmeter? > Messt doch mal sämtliche Spannung aus, > die an den Kondensatoren des MAX sind und schreibt diese hier! > Ihr habt die Kondensatoren wie im Datenblatt angeschlossen > und auch ähnliche Größe? Und richtig herum? > Ausreichende Spannung der Kondensatoren? Die Spannungen passen weiß sie nicht auswendig aber wir haben sie schon einmal geprüft und die Kondensator sind die die im Datenblatt angegeben sind und sie sind richtig verbaut. > Habt Ihr das LabView-Programm selbst geschrieben? > Vielleicht mal hier rein stellen? > (Ich hab noch nie LabView benutzt, noch programmiert...) > Oder vielleicht mal ein Terminal-Programm statt LabView benutzen? Ja das wurde von mir geschrieben Ja es wurde ein Hyperterminal verwendet und getestet gleiches Problem wie beim Labview. > Welche Baudrate benutzt ihr? 8N1? > Die Negier-Sachen sind jetzt überall draußen? Baudrate 9600 wie meinst du draußen? also in den Programmen ist keine negier funktion mehr > Oder statt dem uC einen zweiten seriellen Port > (gleicher oder anderer PC) anschließen > (GND1 <-> GND2, RX1 <-> TX2, RX2 <-> TX1) > und schauen, ob die gesendeten Zeichen dort ankommen. ja das funktioniert haben wir schon mal getestet. > Ist es ein 32 Bit Windows oder 64 Bit? > Falls 32 Bit, könnte Portmon weiterhelfen... 64-Bit Win7 > Kann man bei Labview zyklisch Zeichen senden, > z.B. jede Sekunde ein 'a'. > Dann mit dem Oszi eine Aufnahme machen? > 2-Kanal-Oszi? Dann auf je einem Kanal > einmal vor dem MAX und einmal dahinter. > Dann müsste man sehen, wie sich die Bits verändern > (in eurem Fall von 'a' nach komischem 'z'). Puh dass weiß ich gar nicht aber, ich habe zuhause e kein Oszi zu verfügung
Hab jetzt folgendes geändert: OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //von USART_BRGH_HIGH zu USART_BRGH_LOW Leider ändert es nichts an dem Endergebnis, es leuchten weiterhin alle LEDs. Hier mal ein Auszug aus dem Programm:
1 | #include <p18cxxx.h> |
2 | #include "init.h" |
3 | #include <delays.h> |
4 | #include <usart.h> |
5 | #include <timers.h> |
6 | #include <pwm.h> |
7 | |
8 | #pragma code
|
9 | |
10 | |
11 | //Prototypes for Additional Delay Functions
|
12 | void DelayFor18TCY(void); |
13 | void DelayPORXLCD(void); |
14 | void DelayXLCD(void); |
15 | void LED1(void); |
16 | void LED2(void); |
17 | void LED3(void); |
18 | void LED4(void); |
19 | void LED5(void); |
20 | .
|
21 | .
|
22 | .
|
23 | void LED25(void); |
24 | void Muster1(void); |
25 | void Muster2(void); |
26 | void Muster3(void); |
27 | void Muster4(void); |
28 | void Muster5(void); |
29 | void Back(void); |
30 | void Falsch(void); |
31 | void USARTRxIntHndl(void); |
32 | void HighIntHndl(void); |
33 | |
34 | #pragma code IntVectHigh=0x08
|
35 | void IntVectHigh (void) |
36 | {
|
37 | _asm GOTO HighIntHndl _endasm |
38 | }
|
39 | |
40 | |
41 | //pragma to return to normal program section
|
42 | #pragma code
|
43 | |
44 | |
45 | |
46 | #pragma interrupt HighIntHndl
|
47 | void HighIntHndl(void) |
48 | {
|
49 | |
50 | Nop(); |
51 | |
52 | if(PIR1 & 0b00100000) |
53 | {
|
54 | USARTRxIntHndl(); |
55 | return; |
56 | }
|
57 | |
58 | |
59 | }
|
60 | |
61 | //USART Rx Int Hndl
|
62 | void USARTRxIntHndl(void) |
63 | {
|
64 | char USARTRxVal; |
65 | static int PWM1DCVal; |
66 | |
67 | |
68 | USARTRxVal=ReadUSART(); |
69 | PIR1bits.RCIF=0; |
70 | |
71 | switch(USARTRxVal) |
72 | {
|
73 | case ('A'|'a'): |
74 | LED1(); |
75 | break; |
76 | |
77 | case ('B'|'b'): |
78 | LED2(); |
79 | break; |
80 | |
81 | case ('C'|'c'): |
82 | LED3(); |
83 | break; |
84 | .
|
85 | .
|
86 | .
|
87 | case ('Y'|'y'): |
88 | LED25(); |
89 | break; |
90 | |
91 | case ('Z'|'z'): |
92 | Back(); |
93 | break; |
94 | |
95 | case ('1'|'5'): |
96 | Muster1(); |
97 | break; |
98 | |
99 | |
100 | default:
|
101 | Falsch(); |
102 | break; |
103 | |
104 | }
|
105 | void LED1(void) |
106 | {
|
107 | if (PORTAbits.RA0==0) |
108 | PORTAbits.RA0=1; |
109 | |
110 | else
|
111 | PORTAbits.RA0=0; |
112 | }
|
113 | .
|
114 | .
|
115 | .
|
116 | void Back(void) |
117 | {
|
118 | PORTA=0x00; |
119 | PORTBbits.RB0=0; |
120 | PORTBbits.RB1=0; |
121 | PORTBbits.RB2=0; |
122 | PORTBbits.RB3=0; |
123 | PORTBbits.RB4=0; |
124 | PORTCbits.RC0=0; |
125 | PORTCbits.RC1=0; |
126 | PORTCbits.RC2=0; |
127 | PORTD=0x00; |
128 | PORTE=0x00; |
129 | }
|
130 | |
131 | void Falsch(void) |
132 | {
|
133 | PORTA=0xFF; |
134 | PORTE=0xFF; |
135 | PORTBbits.RB0=1; |
136 | PORTBbits.RB1=1; |
137 | PORTBbits.RB2=1; |
138 | PORTBbits.RB3=1; |
139 | PORTBbits.RB4=1; |
140 | PORTCbits.RC0=1; |
141 | PORTCbits.RC1=1; |
142 | PORTCbits.RC2=1; |
143 | PORTD=0xFF; |
144 | PORTE=0xFF; |
145 | }
|
146 | |
147 | void main() |
148 | {
|
149 | |
150 | init(); |
151 | |
152 | TRISA = 0x00; |
153 | TRISBbits.TRISB0=0; |
154 | TRISBbits.TRISB1=0; |
155 | TRISBbits.TRISB2=0; |
156 | TRISBbits.TRISB3=0; |
157 | TRISBbits.TRISB4=0; |
158 | TRISCbits.TRISC0=0; |
159 | TRISCbits.TRISC1=0; |
160 | TRISCbits.TRISC2=0; |
161 | TRISD = 0x00; |
162 | TRISE = 0x00; |
163 | |
164 | //--->>> Open USART
|
165 | //--->>> Rx Ints Enabled, Async Mode, 8N1, 9600Baud @ 20MHz
|
166 | OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //25 |
167 | |
168 | |
169 | INTCONbits.GIEH=1; |
170 | |
171 | //Loop Forever
|
172 | while(1) |
173 | {
|
174 | Nop(); |
175 | |
176 | |
177 | }
|
178 | }
|
Das geht so nicht: case ('A'|'a'): Musst du 2 Fälle draus machen! Aber nicht der Kern des Problems...
Ich glaube, dass dies auch nicht funktioniert: void LED1(void) { if (PORTAbits.RA0==0) PORTAbits.RA0=1; else PORTAbits.RA0=0; } Hast du dies mal einzeln getestet, ob du damit LEDs steuern kannst? Aber zum UART: OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //25 Was soll die Zeile machen? '&' ist ein binäres AND, also kommt als Wert vermutlich 0 raus... Vermutlich muss es statt '&' überall ein '|' sein?
Martin Maurer schrieb: > Das geht so nicht: > > case ('A'|'a'): > > Musst du 2 Fälle draus machen! > Aber nicht der Kern des Problems... naja ich schicke aber nur kleinbuchstaben mit Labview ist dann ein problem ?
Kannst du mal suchen lassen, welche Werte (nur ein paar) diese Defines haben? USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW Ich sehe viele solche Beispiele, wenn ich danach Google... (vielleicht doch nicht falsch?)
Launga schrieb: > Martin Maurer schrieb: >> Das geht so nicht: >> >> case ('A'|'a'): >> >> Musst du 2 Fälle draus machen! >> Aber nicht der Kern des Problems... > > naja ich schicke aber nur kleinbuchstaben mit Labview ist dann ein > problem ? Dein Glück, oder Pech, dass 'A' und 'a' fast dieselbe Bitdarstellung haben. WEnn du die miteinander veroderst, dann kommt 'a' raus. Wären die ASCII Darstellungen anders, dann würde da Unsinn rauskommen. Generell: solange ihr nicht sicher seid, dass die UART problemlos funktioniert seid ihr gut beraten möglichst wenig Code zu haben, in den ihr Fehler einbauen könnt. Um die UART an sich zu debuggen, ist es sinnvoll ein Programm zu schreiben, welches nichts anderes tut, als zb ein 'x' zu senden. Solange ihr auf dem PC in einem Terminalprogramm diese 'x' nicht korrekt seht, ist die UART noch fehlerhaft. Solange das so ist, ist es sinnlos, da noch mehr Code drüberzustülpen, so werdet ihr die UART nie debuggen können. Denn ihr wisst nie, ob das Problem jetzt die UART ist, oder ob ihr in eurem eigenen Programm noch Fehler habt. Und wenn ich mir das Programm so ansehe, dann seid ihr gut beraten, diese letzte Fehlerquelle erst mal auszuschliessen. Erst dann, wenn klar ist, dass die UART einwandfrei funktioniert, erst dann macht es Sinn, euren eigentlichen Code zu testen.
:
Bearbeitet durch User
Launga schrieb: > naja ich schicke aber nur kleinbuchstaben mit Labview ist dann ein > problem ? Das ist dann eher Zufall, daß das funktioniert. Schreib' entweder
1 | switch (USARTRxVal) |
2 | {
|
3 | case 'A' : |
4 | case 'a' : |
5 | ...
|
6 | break; |
7 | |
8 | case 'B' : |
9 | case 'b' : |
10 | ...
|
oder
1 | switch (toupper(USARTRxVal)) |
2 | {
|
3 | case 'A' : |
4 | ...
|
5 | break; |
6 | |
7 | case 'B' : |
8 | ...
|
Was Du machst, ist ein bitweises OR aus den Werten von 'A' und 'a' (0x41 und 0x61) - was 'a' (0x61) ergibt. Mit einem 'A' würde Dein Code also nie funktionieren.
Rufus Τ. Firefly schrieb: > Was Du machst, ist ein bitweises OR aus den Werten von 'A' und 'a' (0x41 > und 0x61) - was 'a' (0x61) ergibt. Mit einem 'A' würde Dein Code also > nie funktionieren. Exakt. Das zb
1 | case ('1'|'5'): |
wird nie richtig funktionieren.
>Um die UART an sich zu debuggen, ist es >sinnvoll ein Programm zu schreiben, welches nichts anderes tut, als zb >ein 'x' zu senden. Ich sende immer erst mal ein 'U' -> 0x55. Dann kann man mit dem Osci die Bitzeiten ausmessen und nachrechnen ob die Baudrate stimmt. Leider hat er ja kein Osci.
Also noch mal von Vorne. Hab das ganze jetzt einmal vereinfacht, sodass er nur das 'a' sucht bzw. wenn irgendetwas kommt alle leuchten soll.
1 | #include <p18cxxx.h> |
2 | #include "init.h" |
3 | #include <delays.h> |
4 | #include <usart.h> |
5 | #include <timers.h> |
6 | #include <pwm.h> |
7 | |
8 | #pragma code
|
9 | |
10 | |
11 | //Prototypes for Additional Delay Functions
|
12 | void DelayFor18TCY(void); |
13 | void DelayPORXLCD(void); |
14 | void DelayXLCD(void); |
15 | void LED1(void); |
16 | void Falsch(void); |
17 | void USARTRxIntHndl(void); |
18 | void HighIntHndl(void); |
19 | |
20 | |
21 | //Insert Hign Interrupt Vector at 0x08 including code pragma
|
22 | #pragma code IntVectHigh=0x08
|
23 | void IntVectHigh (void) |
24 | {
|
25 | _asm GOTO HighIntHndl _endasm |
26 | }
|
27 | |
28 | |
29 | //pragma to return to normal program section
|
30 | #pragma code
|
31 | |
32 | |
33 | //High Interrupt Handler Tests for ADIF
|
34 | //On interrupt true calls ADIFIntHndl
|
35 | #pragma interrupt HighIntHndl
|
36 | void HighIntHndl(void) |
37 | {
|
38 | //Determine which Interrupt occurred
|
39 | Nop(); |
40 | //--->>>Determine if Rx Int fired
|
41 | //--->>>If fired call USARTRxIntHndl function
|
42 | if(PIR1 & 0b00100000) //Test USART RXIF |
43 | {
|
44 | USARTRxIntHndl(); |
45 | return; |
46 | }
|
47 | |
48 | |
49 | }
|
50 | |
51 | //USART Rx Int Hndl
|
52 | void USARTRxIntHndl(void) |
53 | {
|
54 | char USARTRxVal; |
55 | static int PWM1DCVal; |
56 | |
57 | |
58 | USARTRxVal=ReadUSART(); |
59 | PIR1bits.RCIF=0; |
60 | |
61 | switch(USARTRxVal) |
62 | {
|
63 | case 'a': |
64 | LED1(); |
65 | break; |
66 | |
67 | default:
|
68 | Falsch(); |
69 | break; |
70 | }
|
71 | |
72 | SetDCPWM1(PWM1DCVal); |
73 | return; |
74 | }
|
75 | |
76 | void LED1(void) |
77 | {
|
78 | if (PORTAbits.RA0==0) |
79 | PORTAbits.RA0=1; |
80 | |
81 | else
|
82 | PORTAbits.RA0=0; |
83 | }
|
84 | |
85 | |
86 | void Falsch(void) |
87 | {
|
88 | PORTA=0xFF; |
89 | PORTE=0xFF; |
90 | PORTBbits.RB0=1; |
91 | PORTBbits.RB1=1; |
92 | PORTBbits.RB2=1; |
93 | PORTBbits.RB3=1; |
94 | PORTBbits.RB4=1; |
95 | PORTCbits.RC0=1; |
96 | PORTCbits.RC1=1; |
97 | PORTCbits.RC2=1; |
98 | PORTD=0xFF; |
99 | PORTE=0xFF; |
100 | }
|
101 | |
102 | void main() |
103 | {
|
104 | |
105 | init(); |
106 | |
107 | TRISA = 0x00; |
108 | TRISBbits.TRISB0=0; |
109 | TRISBbits.TRISB1=0; |
110 | TRISBbits.TRISB2=0; |
111 | TRISBbits.TRISB3=0; |
112 | TRISBbits.TRISB4=0; |
113 | TRISCbits.TRISC0=0; |
114 | TRISCbits.TRISC1=0; |
115 | TRISCbits.TRISC2=0; |
116 | TRISD = 0x00; |
117 | TRISE = 0x00; |
118 | |
119 | |
120 | //--->>> Open USART
|
121 | //--->>> Rx Ints Enabled, Async Mode, 8N1, 9600Baud @ 20MHz
|
122 | OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //warum genau & sind kann ich nicht sagen, aber es sind auf alle Fälle USART Einstellungen und denke mal das diese mit & erweitert werden |
123 | |
124 | |
125 | //Set GIEH
|
126 | INTCONbits.GIEH=1; |
127 | |
128 | //Loop Forever
|
129 | while(1) |
130 | {
|
131 | Nop(); |
132 | }
|
133 | }
|
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //25 Ich habe gerade mal im usart.h nachgeschaut, die '&' könnten stimmen. Da gibt es 2 Modes: AND (default) und OR Sind die 129 richtig?
>Also noch mal von Vorne. Hab das ganze jetzt einmal vereinfacht, sodass >er nur das 'a' sucht bzw. wenn irgendetwas kommt alle leuchten soll. Und was tut sich bei deinen LEDs?
Martin Maurer schrieb: > OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & > USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //25 > > Ich habe gerade mal im usart.h nachgeschaut, > die '&' könnten stimmen. Kann ich mir nicht vorstellen. Sinn der Sache ist es ja wohl, genau diese Bits alle zu setzen. Dazu brauchst es aber das | Mit einem & würde da eine Schnittmenge rauskommen. Welche Bits sind in all diesen Werten auf 1? Und nur dieses Ergebnis würde gesetzt werden. Da müssten sie schon die Definitionen 'active Low' gemacht haben. Was mehr als ungewöhnlich wäre.
:
Bearbeitet durch User
Ist Masse verbunden? Auf dem skizzierten Schaltplan ist es nicht....Hast Du die gleiche baudrate am PC?
Bülent C. schrieb: > Ist Masse verbunden? Auf dem skizzierten Schaltplan ist es nicht....Hast Ja ist verbunden > Du die gleiche baudrate am PC? ja ist auch eingestellt
@Karl-Heinz: Die sind so definiert: #ifndef USE_OR_MASKS #define USART_TX_INT_ON 0b11111111 // Transmit interrupt on #define USART_TX_INT_OFF 0b01111111 // Transmit interrupt off #define USART_RX_INT_ON 0b11111111 // Receive interrupt on #define USART_RX_INT_OFF 0b10111111 // Receive interrupt off #define USART_BRGH_HIGH 0b11111111 // High baud rate #define USART_BRGH_LOW 0b11101111 // Low baud rate #define USART_CONT_RX 0b11111111 // Continuous reception #define USART_SINGLE_RX 0b11110111 // Single reception #define USART_SYNC_MASTER 0b11111111 // Synchrounous master mode #define USART_SYNC_SLAVE 0b11111011 // Synchrounous slave mode #define USART_NINE_BIT 0b11111111 // 9-bit data #define USART_EIGHT_BIT 0b11111101 // 8-bit data #define USART_SYNCH_MODE 0b11111111 // Synchronous mode #define USART_ASYNCH_MODE 0b11111110 // Asynchronous mode #define USART_ADDEN_ON 0b11111111 // Enables address detection #define USART_ADDEN_OFF 0b11011111 // Disables address detection //------------AND MASK------------------------------------------------ #else #define USART_TX_INT_ON 0b10000000 // Transmit interrupt on #define USART_TX_INT_OFF 0b00000000 // Transmit interrupt off #define USART_TX_INT_MASK (~USART_TX_INT_ON) //Mask Trnasmit Interrupt select bit #define USART_RX_INT_ON 0b01000000 // Receive interrupt on #define USART_RX_INT_OFF 0b00000000 // Receive interrupt off #define USART_RX_INT_MASK (~USART_RX_INT_ON) //Mask Receive Interrupt select bit #define USART_ADDEN_ON 0b00100000 // Enables address detection #define USART_ADDEN_OFF 0b00000000 // Disables address detection #define USART_ADDEN_MASK (~USART_ADDEN_ON) //Mask address detection select bit #define USART_BRGH_HIGH 0b00010000 // High baud rate #define USART_BRGH_LOW 0b00000000 // Low baud rate #define USART_BRGH_MASK (~USART_BRGH_HIGH) //Mask baud rate select bit #define USART_CONT_RX 0b00001000 // Continuous reception #define USART_SINGLE_RX 0b00000000 // Single reception #define USART_CONT_RX_MASK (~USART_CONT_RX) //Mask Continuous Reception select bit #define USART_SYNC_MASTER 0b00000100 // Synchrounous master mode #define USART_SYNC_SLAVE 0b00000000 // Synchrounous slave mode #define USART_SYNC_MASK (~USART_SYNC_MASTER) //Mask usart mode select bit #define USART_NINE_BIT 0b00000010 // 9-bit data #define USART_EIGHT_BIT 0b00000000 // 8-bit data #define USART_BIT_MASK (~USART_NINE_BIT) //Mask 9 bit transmit select bit #define USART_SYNCH_MODE 0b00000001 // Synchronous mode #define USART_ASYNCH_MODE 0b00000000 // Asynchronous mode #define USART_MODE_MASK (~USART_SYNCH_MODE) //Mask sync/async mode select bit #endif
Bülent C. schrieb: > Schaumal was ich für euch gefunden habe....Scheint ein Problem mit > dem > PIC zu sein.... > Hier ein Auszug > Using the PIC24 with BRGH = 1 is a problem and you will find many > occurances of this problem here in the forum. Whether this problem is > the one you are seeing depends on the silicon revision of your chip, see > the errata http://ww1.microchip.com/downloads/en/DeviceDoc/80471a.pdf . > The only sure fire way to get around it if you have one of the affected > revisions is to stick with BRGH = 0. > Hope this helps, > > Nachdem BRGH = 0 gesetzt wurde hatte es geklappt....Er hatte genau die > gleichen probleme wie ihr. > > http://www.microchip.com/forums/m451419-print.aspx Da steht "Using PIC24", doch die Jungs nehmen doch den PIC18F4550, in dessen Errata nichts bzgl. diesen Problems steht. Ist das richtig, das in dem "Schaltplan" Bild die RX Leitung nicht an Rx vom PIC geht? Martin Maurer schrieb: > Ich glaube, dass dies auch nicht funktioniert: > > void LED1(void) > { > if (PORTAbits.RA0==0) > PORTAbits.RA0=1; > > else > PORTAbits.RA0=0; > } Das könnte meines Wissens so aussehen: PORTAbits.RA0 = ~PORTAbits.RA0 Ich hätte das aber denke ich anders gemacht als eine extra Funktion (pro LED), die nur die LED toggelt. PS: Schönes (vorallem übersichtliches) Blockschaltbild von LabVIEW und erahnendes Hintergrundbild ;)
Martin Maurer schrieb: > @Karl-Heinz: > > Die sind so definiert: Wahnsinn. Die haben tatsächlich eine Version für 'active Low' gebaut. Und? Ist USE_OR_MASKS defaultmässig definiert oder nicht?
Karl Heinz schrieb: > Martin Maurer schrieb: >> OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & >> USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //25 >> >> Ich habe gerade mal im usart.h nachgeschaut, >> die '&' könnten stimmen. > > Kann ich mir nicht vorstellen. > > Sinn der Sache ist es ja wohl, genau diese Bits alle zu setzen. Dazu > brauchst es aber das | > > Mit einem & würde da eine Schnittmenge rauskommen. Welche Bits sind in > all diesen Werten auf 1? Und nur dieses Ergebnis würde gesetzt werden. > > Da müssten sie schon die Definitionen 'active Low' gemacht haben. Was > mehr als ungewöhnlich wäre. Die Zeile mit den & ist schon richtig. Zur Info, so sind die einzelnen Makros definiert:
1 | #define USART_TX_INT_ON 0b11111111 // Transmit interrupt on
|
2 | #define USART_TX_INT_OFF 0b01111111 // Transmit interrupt off
|
3 | #define USART_RX_INT_ON 0b11111111 // Receive interrupt on
|
4 | #define USART_RX_INT_OFF 0b10111111 // Receive interrupt off
|
5 | #define USART_BRGH_HIGH 0b11111111 // High baud rate
|
6 | #define USART_BRGH_LOW 0b11101111 // Low baud rate
|
7 | #define USART_CONT_RX 0b11111111 // Continuous reception
|
8 | #define USART_SINGLE_RX 0b11110111 // Single reception
|
9 | #define USART_SYNC_MASTER 0b11111111 // Synchrounous master mode
|
10 | #define USART_SYNC_SLAVE 0b11111011 // Synchrounous slave mode
|
11 | #define USART_NINE_BIT 0b11111111 // 9-bit data
|
12 | #define USART_EIGHT_BIT 0b11111101 // 8-bit data
|
13 | #define USART_SYNCH_MODE 0b11111111 // Synchronous mode
|
14 | #define USART_ASYNCH_MODE 0b11111110 // Asynchronous mode
|
15 | #define USART_ADDEN_ON 0b11111111 // Enables address detection
|
16 | #define USART_ADDEN_OFF 0b11011111 // Disables address detection
|
Grüße.
>> Sind die 129 richtig? > >Bin mir ziemlich sicher: >9600Baud >20MHz Sicher? > OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & > USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); //25 Für BRGH = 0 steht aber 31 im Datenblatt.
Michael Skropski schrieb: > Ist das richtig, das in dem "Schaltplan" Bild die RX Leitung nicht an Rx > vom PIC geht? jetzt wo du es sagst.. das verwirrt mich jetzt selbst. > PS: Schönes (vorallem übersichtliches) Blockschaltbild von LabVIEW und > erahnendes Hintergrundbild ;) Das Caos in meinen LapView programm weiß ich nur zu gut, auch wenn man es nicht glaubt aber ich kenne mich noch aus in meinen Caos aus :P Ein bisschen nackte haut an desktop vertreibt kummer und sorgen :)
Mal eine ganz andere Frage: Warum wollt ihr den 18F4550 ausgerechnet über RS232 mit dem PC verbinden? War das die exakte Aufgabenstellung? Wurde der PIC vorgegeben? Ich frage nur, weil dieser PIC ein USB-Interface hat, und es für den PIC Bibliotheken gibt, um eine serielle Schnittstelle über den USB und einen virtuellen COM-Port nachzubilden. ;-)
Zu diesem Teil nochmal: > if (PORTAbits.RA0==0) > PORTAbits.RA0=1; > > else > PORTAbits.RA0=0; Kann man bei einem PIC18, wenn ein GPIO als Ausgang definiert ist, den Wert, den man gesetzt hat, wieder zurück lesen? @Karl Heinz: Hab ich vorher auch noch nicht gesehen... USE_OR_MASKS kommt zumindest in obigem Code nicht vor. Aber es könnte natürlich in der IDE irgendwo definiert sein... Vielleicht mal so etwas ergänzen... #ifndef USE_OR_MASKS #else ERROR-ERROR-ERROR #endif Dann wirft er einen Fehler, falls es definiert ist.
Michael L. schrieb: > Mal eine ganz andere Frage: > > Warum wollt ihr den 18F4550 ausgerechnet über RS232 mit dem PC > verbinden? > War das die exakte Aufgabenstellung? > Wurde der PIC vorgegeben? > > Ich frage nur, weil dieser PIC ein USB-Interface hat, und es für den PIC > Bibliotheken gibt, um eine serielle Schnittstelle über den USB und einen > virtuellen COM-Port nachzubilden. > > ;-) Nein war nicht vorgegeben, allerdings haben wir schon mal mit der Seriellen Schnittstelle gearbeitet und damals klappte es auch nur da hatten wir einen anderen PIC.
Michael L. schrieb: > Mal eine ganz andere Frage: > > Warum wollt ihr den 18F4550 ausgerechnet über RS232 mit dem PC > verbinden? > War das die exakte Aufgabenstellung? > Wurde der PIC vorgegeben? > > Ich frage nur, weil dieser PIC ein USB-Interface hat, und es für den PIC > Bibliotheken gibt, um eine serielle Schnittstelle über den USB und einen > virtuellen COM-Port nachzubilden. > > ;-) Ja wir wählten diesen da wir mit den schon Erfahrungen hatten und ein Lehrer der uns µController programmieren gelernt hat, hat gemeint in 6 Wochen schaffen wir es nicht das Usb-Interface und allen anderen Sachen auseinanderzusetzen die wir für dieses Projekt benötigen, daher die Serielle Schnittstelle da wir mit dieser schon am Demoboard gearbeitet haben
Martin Maurer schrieb: > USE_OR_MASKS kommt zumindest in obigem Code nicht vor. > Aber es könnte natürlich in der IDE irgendwo definiert sein... > > Vielleicht mal so etwas ergänzen... > > #ifndef USE_OR_MASKS > #else > ERROR-ERROR-ERROR > #endif > > Dann wirft er einen Fehler, falls es definiert ist. Selbst wenn ich die 4 Zeilen einfüge ändert sich nichts. Er kann es übersetzen, auf den PIC spielen und srpingt wieder in das default wenn er ein 'a' bekommt, welches, so denke ich, nicht als 'a' sondern irgendetwas anderes kommt.
Dominik schrieb: > Nein war nicht vorgegeben, allerdings haben wir schon mal mit der > Seriellen Schnittstelle gearbeitet und damals klappte es auch nur da > hatten wir einen anderen PIC. Gleicher code? Wenn ja, dann liegt der Verdacht mit BRGH=0 evtl. nahe...ändert die 129 noch in 31 ab...
Dominik schrieb: > Es werden Buchstaben vom Notebook über die serielle Schnittstelle > gesendet, der Max empfängt diese auch richtig, doch er invertiert diese. Nein, der invertiert nicht. Das ist falsch ausgedrückt. Der MAX232 konvertiert auf RS232-Pegel, und die sind: Logische 0: +3 bis +15V Logische 1: -15 bis -3V Dabei sind -3 bis +3V undefiniert.
>Wenn ja, dann liegt der Verdacht mit BRGH=0 evtl. nahe...ändert die 129 >noch in 31 ab... Oder USART_BRGH_HIGH mit 129. Ergibt auch einen kleineren Fehler.
greg schrieb: > Dominik schrieb: >> Es werden Buchstaben vom Notebook über die serielle Schnittstelle >> gesendet, der Max empfängt diese auch richtig, doch er invertiert diese. > > Nein, der invertiert nicht. Das ist falsch ausgedrückt. Der MAX232 > konvertiert auf RS232-Pegel, und die sind: > > Logische 0: +3 bis +15V > Logische 1: -15 bis -3V > > Dabei sind -3 bis +3V undefiniert. Das Problem dabei ist das wir keinen MAX 232 besitzen sondern einen MAX 3232.
Dominik schrieb: > Das Problem dabei ist das wir keinen MAX 232 besitzen sondern einen MAX > 3232. Das ist kein Problem, denn das ist eigentlich nur eine moderne Version vom MAX232, u.a. mit größerem Betriebsspannungsbereich.
Bülent C. schrieb: > Dominik schrieb: >> Nein war nicht vorgegeben, allerdings haben wir schon mal mit der >> Seriellen Schnittstelle gearbeitet und damals klappte es auch nur da >> hatten wir einen anderen PIC. > > Gleicher code? > Wenn ja, dann liegt der Verdacht mit BRGH=0 evtl. nahe...ändert die 129 > noch in 31 ab... Habe jetzt folgende Kombinationen probiert: 1. OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 31 ); 2. OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_LOW, 129 ); 3. OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT& USART_CONT_RX & USART_BRGH_HIGH, 129 ); Bei alle 3 Varianten ändert sich nichts. Sobald ich den µC mit dem Hyperterminal ein 'a' sende, was bedeutet LED1(RA0) sollte leuchten, springt er in den Interrupt Falsch() und lässt alle LEDs leuchten.
holger schrieb: > @Launga > > Hast du meinen Post gelesen? > > Beitrag "Re: Serielle Schnittstelle µC" Oh übersehen sry, ja auch wenn wir 31 einsetzen funktioniert es nicht
>ja auch wenn wir 31 einsetzen funktioniert es nicht Also: USART_BRGH_LOW und 31 geht nicht. USART_BRGH_HIGH und 129 geht auch nicht. Steht aber beides so im Datenblatt. Die zweite Version hat bei mir früher mal funktioniert. Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft.
Launga schrieb: > Ja wir wählten diesen da wir mit den schon Erfahrungen hatten und ein > Lehrer der uns µController programmieren gelernt hat, hat gemeint in 6 > Wochen schaffen wir es nicht das Usb-Interface und allen anderen Sachen > auseinanderzusetzen die wir für dieses Projekt benötigen Wenn man das USB Interface in Assembler und alles von Grund auf selbst schreiben wollte, dann wären 6 Wochen evtl. etwas knapp. Aber für USB gibts eine Bibliothek + CDC-Demo für virtuelle serielle Schnittstelle. Das kann man mit Installation in 1 Stunde zum laufen bekommen. Hab ich mal probiert, als der 18F4550 neu auf den Markt kam ... Edit: Das heißt aber nicht, dass ihr heute damit anfangen sollt ..
:
Bearbeitet durch User
holger schrieb: >>ja auch wenn wir 31 einsetzen funktioniert es nicht > > Also: > > USART_BRGH_LOW und 31 geht nicht. > USART_BRGH_HIGH und 129 geht auch nicht. > > Steht aber beides so im Datenblatt. > > Die zweite Version hat bei mir früher mal funktioniert. > Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft. Da könnte was dran sein....
holger schrieb: > Die zweite Version hat bei mir früher mal funktioniert. > Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft. wie kann man das am besten nachprüfen?
Ich kann mich nur wiederholen: Beendet endlich das Stochern im Nebel und lasst den PIC ein Zeichen an den PC senden. Dort SIEHST du ob es korrekt ankommt! Du hättest dieses Problem schon längst ausgeräumt, wenn du nicht so stur darauf beharren würdest, mit deinem Programm die UART debuggen zu wollen. Geht die UART in die eine Richtung (wegen der Baudrate), dann geht sie auch in die andere Richtung.
>> Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft. >wie kann man das am besten nachprüfen? Lass doch mal eine LED blinken.
Launga schrieb: > holger schrieb: >> Die zweite Version hat bei mir früher mal funktioniert. >> Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft. > wie kann man das am besten nachprüfen? Indem du irgendwas machst, was sensistiv auf die Taktfrequenz ist. Zb eine LED blinken lassen mittels Warteschleifen (typischerweise heissen derartige fertige Verzögerungsschleifen irgendwas mit 'delay').
:
Bearbeitet durch User
Karl Heinz schrieb: > Launga schrieb: >> holger schrieb: >>> Die zweite Version hat bei mir früher mal funktioniert. >>> Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft. >> wie kann man das am besten nachprüfen? > > Indem du irgendwas machst, was sensistiv auf die Taktfrequenz ist. > Zb eine LED blinken lassen mittels Warteschleifen (typischerweise > heissen derartige fertige Verzögerungsschleifen irgendwas mit 'delay'). Eine Led können wir blinken lassen, dass funktioniert einwandfrei.
holger schrieb: >>> Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz > läuft. >>wie kann man das am besten nachprüfen? > > Lass doch mal eine LED blinken. Diese Variante funktioniert:
1 | while(1) |
2 | {
|
3 | if(PORTAbits.RA0==0) |
4 | PORTAbits.RA0=1; |
5 | |
6 | else
|
7 | PORTAbits.RA0=0; |
8 | return; |
9 | }
|
Launga schrieb: > Karl Heinz schrieb: >> Launga schrieb: >>> holger schrieb: >>>> Die zweite Version hat bei mir früher mal funktioniert. >>>> Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft. >>> wie kann man das am besten nachprüfen? >> >> Indem du irgendwas machst, was sensistiv auf die Taktfrequenz ist. >> Zb eine LED blinken lassen mittels Warteschleifen (typischerweise >> heissen derartige fertige Verzögerungsschleifen irgendwas mit 'delay'). > > Eine Led können wir blinken lassen, dass funktioniert einwandfrei. Es geht nicht ums Blinken an sich, sondern um die Zeiten. Wenn du deine Funktion hast, die _delay_ms heisst UND die von der Taktfrequenz abhängt UND du das programmierst
1 | while( 1 ) |
2 | {
|
3 | LED einschalten |
4 | _delay_ms( 1000 ); |
5 | LED ausschalten |
6 | _delay_ms( 1000 ); |
7 | ]
|
und dann die Leucht bzw Dunkelphasen tatsächlich 1 Sekunde lang sind, DANN kann man davon ausgehen, dass die Taktfrequenz (die in _delay_ms mit eingeht) auch stimmt. _delay_ms wird auf deinem System anders heissen, aber irgend so eine Funktion gibt es meistens.
:
Bearbeitet durch User
Launga schrieb: > Karl Heinz schrieb: >> Launga schrieb: >>> holger schrieb: >>>> Die zweite Version hat bei mir früher mal funktioniert. >>>> Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz läuft. >>> wie kann man das am besten nachprüfen? >> >> Indem du irgendwas machst, was sensistiv auf die Taktfrequenz ist. >> Zb eine LED blinken lassen mittels Warteschleifen (typischerweise >> heissen derartige fertige Verzögerungsschleifen irgendwas mit 'delay'). > > Eine Led können wir blinken lassen, dass funktioniert einwandfrei. Auch im vorgegebenem INtervall...z.B 1sec an und 1sec aus?
:
Bearbeitet durch User
> Diese Variante funktioniert: > while(1) > { > if(PORTAbits.RA0==0) > PORTAbits.RA0=1; > > else > PORTAbits.RA0=0; > return; > } Und das Blinkt? :-) Dann hab ihr definitiv keine 20MHz!
Dominik schrieb: > holger schrieb: >>>> Dann liegt der Verdacht nahe das euer PIC gar nicht mit 20MHz >> läuft. >>>wie kann man das am besten nachprüfen? >> >> Lass doch mal eine LED blinken. > > > Diese Variante funktioniert: Schön. Es geht aber nicht ums Blinken selber, sondern um die Zeiten. Die sind ein Indikator dafür, ob Zeitberechnungen, die auf den 20Mhz Taktfrequenz beruhren auch stimmen. Die LED dienen nur dazu, etwas zu haben, womit man die Sache sichtbar machen kann. ISt ein Delay von 1 Sekunde auf 20Mhz berechnet worden UND ist dieser Delay dann auch tatsächlich 1 Sekunde lang (mit der Armbanduhr vergleichen) DANN stimmen auch die 20Mhz. Ok, auf das Herz genau kann man das nicht bestimmen, aber ob das 20Mhz sind oder doch nur 10, das kann man damit schon rauskriegen.
:
Bearbeitet durch User
Launga schrieb: > hat gemeint in 6 > Wochen 6 Wochen! Und am Vorabend der Abgabe kommt ihr drauf, dass eure UART gar nicht funktioniert? d.h. in weiterer Folge auch, dass das Programm noch nie getestet wurde! Gute Nacht.
:
Bearbeitet durch User
>> while(1) >> { >> return; >> } > >Und das Blinkt? :-) Dann hab ihr definitiv keine 20MHz! Und das "return" sollte ein blinken eigentlich unmöglich machen;)
Karl Heinz schrieb: > Launga schrieb: > >> hat gemeint in 6 >> Wochen > > 6 Wochen! > Und am Vorabend der Abgabe kommt ihr drauf, dass eure UART gar nicht > funktioniert? > > Gute Nacht. Wir sind erst vor zwei Wochen mit der Hardware fertig geworden und dann haben wir nur mehr Fehlersuche betätigt und heute wollten wir nochmal mit einem Lehrer durchgehen, doch dieser war heute nicht da und nun haben wir euch gefragt :)
holger schrieb: >>> while(1) >>> { >>> return; >>> } >> >>Und das Blinkt? :-) Dann hab ihr definitiv keine 20MHz! > > Und das "return" sollte ein blinken eigentlich unmöglich machen;) Irgendwie komme ich mir auch verarscht vor
Wie sehen die Config-Bits aus? Die müssen her! Wenn ich mich recht erinnere, werden die in den Delays berücksichtigt, und der Blink-Test bringt dann u.U. trotz falscher Konfiguration die richtige Blinkfrequenz.
Launga schrieb: > Karl Heinz schrieb: >> Launga schrieb: >> >>> hat gemeint in 6 >>> Wochen >> >> 6 Wochen! >> Und am Vorabend der Abgabe kommt ihr drauf, dass eure UART gar nicht >> funktioniert? >> >> Gute Nacht. > > Wir sind erst vor zwei Wochen mit der Hardware fertig geworden und du denkst, das kann mich jetzt beruhigen? 4 Wochen um einen popeligen 8-Bit PIC auf eine Platine zu kleistern und einen MAX232 anzuschliessen? Du reitest dich immer weiter rein.
Karl Heinz schrieb: >> Wir sind erst vor zwei Wochen mit der Hardware fertig geworden > > und du denkst, das kann mich jetzt beruhigen? 4 Wochen um einen > popeligen 8-Bit PIC auf eine Platine zu kleistern und einen MAX232 > anzuschliessen? > Du reitest dich immer weiter rein. Ich will es nicht gut heißen, aber: Software ist nichts was man anfassen kann. Die hatten vermutlich keinen blassen Schimmer, wie viel Arbeit da drinn steckt, und haben in aller Seelenruhe an der Platine gewerkelt. (Allerdings hätte der Lehrer das sehen und eingreifen können.) ;-)
Karl Heinz schrieb: > und du denkst, das kann mich jetzt beruhigen? 4 Wochen um einen > popeligen 8-Bit PIC auf eine Platine zu kleistern und einen MAX232 > anzuschliessen? > Du reitest dich immer weiter rein. Bauteile bestellen über weihnachten und da haben wir uns nicht gesehen 2 Wochen, davor schaltplan, programmierung und Labviewprogramm gemacht. Nach Weihnachten also 2014 einmal auf dem Steckbrett aufgebaut, dann geätzt und dann hardware eingelötet, wir haben einmal in der woche 4 stunden im labor.
Kleiner Tipp an Dominik und Launga: Wenn ihr diese Nacht noch was sinnvolles machen wollt, schreibt einen Antrag auf Verschiebung des Abgabetermins (Begründung nicht vergessen). ;-)
Michael L. schrieb: > Kleiner Tipp an Dominik und Launga: > > Wenn ihr diese Nacht noch was sinnvolles machen wollt, schreibt einen > Antrag auf Verschiebung des Abgabetermins (Begründung nicht vergessen). > > ;-) Würden wir gerne, nur steht alles im Pflichtenheft auch Uhrzeit. Wir werden den Lehrer jetzt einfach mit einem Guten Protokoll und einer detaillierten Fehlerüberprüfung überzeugen Und danke für die Hilfe und noch einen schönen Abend ;D Mfg Launga
Michael L. schrieb: > Kleiner Tipp an Dominik und Launga: > > Wenn ihr diese Nacht noch was sinnvolles machen wollt, schreibt einen > Antrag auf Verschiebung des Abgabetermins (Begründung nicht vergessen). > > ;-) Besten Dank aber programmieren kann man nur die Bedienungsoberfläche funktioniert halt nicht. Mit einer guten Dokumentation, was mir haben, wird es schon eine gute Note werden. @Heinz Es war unser erstes größeres Projekt, welches wir selbstständig erarbeitet haben. Wir wussten es ist eine Herausforderung und die haben wir zum größten Teil geschafft. Und wie Launga bereits erwähnt hat, 4 Stunden jede Woche und das ganze 6 Wochen lang, ein solches Projekt fertig zu stellen ist nahe zu unschaffbar, für die die normalerweise damit nichts zu tun haben bzw. nur sehr wenig. @alle anderen Wollte mal Danke sagen an Alle die geholfen haben oder es probiert haben, bin schwer begeistert wie schnell man hier Hilfe bekommt.
Noch ein Schnellschuss ohne Blick ins Datenblatt von mir: - Habt ihr den RX-Pin als Input definiert? - Habt ihr die ANSEL-Register dafur von analog-in auf digital-in gesetzt? Das war bei mir letztens Ursache eines ähnlichen Problems. Ansonsten empfehele ich den Blick ins datenblatt, da ist unter serial receiver schritt für schritt erklärt, was man machen muss (umgeht aber die bibliothek und setzt die Bits direkt)
Karl Heinz schrieb: > und du denkst, das kann mich jetzt beruhigen? 4 Wochen um einen > popeligen 8-Bit PIC auf eine Platine zu kleistern und einen MAX232 > anzuschliessen? > Du reitest dich immer weiter rein Ruhig Blut Karl Heinz :o) Wenn ich nichts übersehen habe, hat es hier auch 6 Stunden gedauert bis mal das Thema Baudrate/Takt überprüfen angesprochen wurde. ;o)
#define USART_BRGH_HIGH 0b11111111 // High baud rate #define USART_BRGH_LOW 0b11101111 // Low baud rate Bei 20MHz und 9600 Baud. Ich kenne jetzt das Datenblatt nicht wie der PIC die Baudrate ausrechnet, um die richtig ein zu stellen könnte man darin vielleicht auch mal NACHLESEN. Zum anderen, wenn man ein wenig Google bemüht gibt es sicher auch für den PIC jede Menge Baudraten-Rechner sicher Online oder als Excel Tabelle. Ihr habt euch ja richtig Mühe gegeben zur allgemeinen Verwirrung bei zu tragen. In der Regel wird so gerechnet: 20MHz / 9600 = 2083,33 Nun Sampeln* die UART's meist mit 16 Teilungen je Bit oder um eine höhere Bautdrate zu erreichen auch mit 8. Dafür ist der Parameter USART_BRGH_xxx zuständig. (*) Zahlen stehen im Datenblatt ich kenne die nicht auswendig. Somit: 2083,33 / 16 = 130 oder 2083,33 / 8 = 260 Manchmal muss auch noch 1 von den Zahlen abgezogen werden, steht auch im Datenblatt. Microchip schreibt sicher in einer passenden Application Note wie man vorgehen muss um einen UART zu nutzen und Microchip hat sicher auch passende Demo-Programme in denen man was abschreiben kann. Erst wenn man diese Möglichkeiten alle Abgeschöpft hat sollte man das Forum bemühen - wie man hier sieht ist das Forum kein "Wundermittel".
Ich bin auch aus Bez. Mistelbach. Wenn ihr euch etwas früher gemeldet hättet, wäre das nicht so das Problem gewesen. Ich hab gestern Abend leider nicht mehr rein geschaut.
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.