mikrocontroller.net

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


Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal hier:

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

Rainer

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: AVRuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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.


void main()
{
    CMCON = 0x07;   // disable analog
    TRISB = 0b00000000;
    TRISA = 0b00001111;
    TMR0  = 0;

    USART_init(9600);
    Delay_ms(500);
    
    while (1) {
    
        // spalte 1
        PORTB = 0b00001000;
        
        Delay_ms(50);

        if(PORTA.F0 == 1) {
            USART_Write('A');
            
            while(PORTA.F0 == 1) {
                Delay_ms(1);
            }
        
        } else if(PORTA.F1 == 1) {
            USART_Write('B');
            
            while(PORTA.F1 == 1) {
                Delay_ms(1);
            }
        
        } else if(PORTA.F2 == 1) {
            USART_Write('C');
            
            while(PORTA.F2 == 1) {
                Delay_ms(1);
            }
        
        } else if(PORTA.F3 == 1) {
            USART_Write('D');
            
            while(PORTA.F3 == 1) {
                Delay_ms(1);
            }
        }
        
        // spalte 2
        PORTB = 0b00010000;
        
        Delay_ms(50);

        if(PORTA.F0 == 1) {
            USART_Write('E');
            
            while(PORTA.F0 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F1 == 1) {
            USART_Write('F');
            
            while(PORTA.F1 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F2 == 1) {
            USART_Write('G');
            
            while(PORTA.F2 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F3 == 1) {
            USART_Write('H');

            while(PORTA.F3 == 1) {
                Delay_ms(1);
            }
        }

        // spalte 3
        PORTB = 0b00100000;
        
        Delay_ms(50);

        if(PORTA.F0 == 1) {
            USART_Write('I');
            
            while(PORTA.F0 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F1 == 1) {
            USART_Write('J');
            
            while(PORTA.F1 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F2 == 1) {
            USART_Write('K');
            
            while(PORTA.F2 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F3 == 1) {
            USART_Write('L');

            while(PORTA.F3 == 1) {
                Delay_ms(1);
            }
        }
        
        // spalte 4
        PORTB = 0b01000000;
        
        Delay_ms(50);
        
        if(PORTA.F0 == 1) {
            USART_Write('M');
            
            while(PORTA.F0 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F1 == 1) {
            USART_Write('N');
            
            while(PORTA.F1 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F2 == 1) {
            USART_Write('O');
            
            while(PORTA.F2 == 1) {
                Delay_ms(1);
            }

        } else if(PORTA.F3 == 1) {
            USART_Write('P');

            while(PORTA.F3 == 1) {
                Delay_ms(1);
            }
        }
        
    }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.