Forum: Mikrocontroller und Digitale Elektronik PIC16F627A und USART (RS232)


von Jens (Gast)


Lesenswert?

Hallo Elektronikfreunde, es ist mal wieder zum Heulen ;-)

Ich habe einen PIC16F627A, an dem eine LED hängt, die PWMed wird, das 
klappt alles wunderbar. Nun möchte ich über RS232 einen neuen DC-Wert an 
den PIC senden. Also 255: LED voll an, 0: LED komplett aus, 127: 
dazwischen, etc. Ihr wisst waws ich meine.

Das PWM-Modul und die USART habe ich so initialisiert (ich nutze ein 
externes 4.194304MHz Quarz, hatte leider nichts ander4es herumliegen):
1
// PWM:
2
PR2 = 0xff;
3
TRISB3 = 0;
4
T2CON = 0b100; // 1:1 prescaler timer1
5
CCP1CON = 0b1100; // set CCP to PWM mode
6
CCPR1L = 0; // DC = 0
7
8
// USART:
9
SPBRG = 63; // Formel: BAUD = F_OSC / 64 / (SPBRG + 1)
10
SYNC = 0;
11
SPEN = 1;
12
RCIE =  1;
13
CPEN = 1;
14
PEIE = 1;
15
GIE = 1;

Das gibt mir eine Baud-Rate von 1024. Im HTerm habe ich dann 
eingestellt: COM1 (gecheckt, der stimmt), Baud 1024, Data 8, Stop 2, 
Parity None, CTS Flow Control = 0.

Meine ISR sieht so aus:
1
static void interrupt isr () {
2
3
  if (RCIF) {
4
    value = RCREG;
5
    CCPR1L = value;
6
    CREN = 0;
7
    CREN = 1;
8
  }
9
10
}

Aber der PIC zeigt keierlei Reaktion. Es kommt nichts an, ist im 
Quellcode ein offensichtlicher Patzer?

Vielen Dank schon einmal für die Hilfe,
Gute nacht,
Jens

von Helfer (Gast)


Lesenswert?

Ich würde eine PC-übliche Baudrate z.B. 1200 Baud benutzen und dafür 
SPBRG auf 55 setzen (-0.7% Fehler).

Bist du sicher, dass der PIC zwei Stopbits benutzt? Ich würde PC-seitig 
ein  Stopbit einstellen.

USART
http://ww1.microchip.com/downloads/en/DeviceDoc/31018a.pdf

Interrupts
http://ww1.microchip.com/downloads/en/DeviceDoc/31008a.pdf

PIC16F627A
http://ww1.microchip.com/downloads/en/DeviceDoc/40044G.pdf

von Jens (Gast)


Lesenswert?

Hi,

das ist lustig, mir sind genau die gleichen Dinge aufgefallen, die du 
gepostet hast:

Ich nehme jetzt 1200 Baud mit Faktor 55 genau wie du vorgeschlagen hast, 
und das Teil hat ein Start- und ein Stop-Bit, also nur ein Stop-Bit, 
irgendwie habe ich die vorher summiert, warum auch immer.

Jetzt passiert auch endlich was, die LED, die gedimmt werden soll, 
ändert ihre Helligkeit, nur leider überhaupt nicht so, wie ich das will. 
Woran kann das liegen?

Selbst wenn ich mit HTerm die ganze Zeit manuell Nullen rausschicke 
(also binär 0b00000000) ändert die LED manchmal ihre Helligkeit, 
manchmal reagiert sie nicht.

Was kann da faul sein?

Gruß
Jens

von Jens (Gast)


Lesenswert?

OK, ich muss etwas Peinliches gestehen. Am MAX232 war eine ungewollte 
Querverbindung (ein entflohenes Lötzinn-Kügelchen) zwischen RX und TX. 
Jetzt klappt alles einwandfrei.

Danke trotzdem für die Hilfe.

Und die Moral von der Geschicht': Den Fehler nicht immer in der Software 
suchen! ;-)

Viele Grüße
Jens

von Jens (Gast)


Lesenswert?

Wen es interessiert, die Schaltung habe ich jetzt hier online gestellt:

http://www.jb-electronics.de/html/elektronik/digital/d_rs232_pwm_dimmer.htm

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.