Forum: Mikrocontroller und Digitale Elektronik Problem mit RS232! PIC 16f88


von Mario K. (mario1989)


Angehängte Dateien:

Lesenswert?

Hallo!

Es soll ein byte bei "Senderpic" nach einem Tasterdruck ins TXREG 
geladen werden. Beim "Empfängerpic" sollte dieses byte aus dem RCREG 
gelesen und in eine Variable geladen werden, und weiters eine LED 
einschalten, wenn das nullte Bit gesetzt ist.

Nun zum Problem: Wenn ich im Debugmodus beim "Senderpic" das TXREG 
anschaue, wird das Byte in dieses geladen. Jedoch erhält der 
"Empfängerpic" kein Signal!! Beide PICs wurden programmiert.

Verwendete PICs: 16f88 Michrochip

Im Anhang sind die asm files!

Bitte helft mir!

Mit freundlichen Grüßen

Mario

von TK (Gast)


Lesenswert?

Hallo Mario,

ich hab den Code zwar nicht ganz durchgesehen - ABER:
Die Empfangsroutine für RCREG sollte in einer Interruptsequenz
ausgewertet werden.
Das label test_store existiert nicht.
Die Baudrate ist nicht definiert.
Kurz um - schau mal im Handbuch nach dem Kapitel UART.
Da sind auch Beispiele für die richtige Deklaration der UART
zum Senden / Empfangen von Bytes.
Ach so:
Mit welchem Oscillator arbeitest Du? Intern oder Extern
Ich vermute mal Intern - wegen dem OSCCAL-Register.
Das sollte übrigens nicht manuell mit einem Wert belegt werden,
sondern den Fabrikwert übernommen werden. (s. Handbuch)

Gruß
TK

von Mario K. (mario1989)


Lesenswert?

Hallo!

Also, die Baudrate ist meines Wissens schon definiert ("SPBRG")!! Und 
auch "store" ist auf einer eigenen Ramzelle ("equ 0x20")!!

Schulkollegen meinten, dass der Code so stimmen sollte (sie haben auch 
keine Interrupts verwendet und es funktioniert!)

LG Mario

von TK (Gast)


Lesenswert?

Das mit der Baudrate hab ich übersehen. Die muss aber auch zum 
Oszillator passen. Besser gesagt zur Frequenz. Und dann auch noch zum 
BRGH-Bit im TXSTA-Register.
Dann noch ein Tipp zum Programmaufbau:
Nach einem Power-On reicht es, wenn die Initialisierungsroutine EINMALIG 
angesprungen wird. Von da aus kann dann die MAIN aufgerufen werden. Die 
MAIN kann dann eine Dauerloop sein. Also nicht nochmal nach INIT 
springen.

Klar geht die Abfrage auf Empfang eines Bytes auch im Polling-Mode. Wenn 
der PIC sonst nichts zu tun hat, ist das auch OK - aber halt nicht die 
Regel, daher hab ich auch geschrieben, dass am Besten die 
Interruptroutine für den
Empfang von Daten angesprungen wird.

Wie sind deine Einsprungadressen definiert?
Resetadresse ist ORG 0x00
Interruptadresse ist ORG 0x04
Die sind nicht vorhanden. z.B:
ORG 0x00
  goto init
ORG 0x04
  retfie
init
  (hier alles initialisieren)
main
  (hier Senden oder Empfangen)
  goto  main

In deiner Empfangsroutine muss auch noch das Register TXSTA belegt 
werden, sonst wird der Port nicht auf UART Mode umgeschaltet. Und dann 
ist das BRGH-Bit auf 0 gesetzt - in deiner Senderoutine jedoch auf 1 -> 
falsche Baudrate.

Gruß
TK

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.