Forum: Mikrocontroller und Digitale Elektronik PIC 16F627 Port einlesen und in int schieben


von Benjamin (Gast)


Lesenswert?

Hallo zusammen,

ich stehe vor einem kleinen Problem:

Ich möchte den Pegel an RB0 auslesen und in ein schieberegister 
schreiben bzw in bytes schieben.

Als test benutze ich grade die UART/RS232 um mir die einzelnen Pegel am 
PC auszugeben. Das funktioniert soweit mit dem folgenden code:
1
 int i;
2
    __delay_us(296);
3
    
4
    for(i=0; i<30; i++)
5
    {
6
        
7
        gelesen = RB0;
8
        printf("%i", gelesen); 
9
        __delay_us(600) ;
Das ergebnis eines leseprozesses sieht dann z.B. so aus:

0001111110011000 (11011110) 111000

Letztendlich interessieren mich nur die bit 17-24, die ich mal 
eingeklammert habe.
Ich hocke jetzt schon ein paar stunden dran und komme einfach nicht 
drauf. Wie bekomme ich diese 8 einzelen bits im richtigen moment in eine 
char oder int geschoben für weitere verarbeitung??

Ich würde mich sehr über eure hilfe freuen!

Gruß
Benjamin

von kopfschüttel (Gast)


Lesenswert?

poste mal den ganzen quelltext, welcher compiler?

von Benjamin (Gast)


Lesenswert?

Hallo,

das ist quasi der ganze quelltext, bzw. das was in der ISR 
steht(ausgelöst durch rb0/INTF.
Was noch fehlt ist
1
unsigned int gelesen= 0x00;

Der compiler ist der Microchip - XC8.

Gruß
Benjamin

von Peter D. (peda)


Lesenswert?

In C schiebt man mit << bzw. >>
1
  uint8_t i;
2
  uint32_t val = 0;
3
  for(i=0; i<30; i++){
4
    vall <<= 1;
5
    if( RB0 )
6
      val |= 1;
7
  }

von kopfschüttel (Gast)


Lesenswert?

Also keine Konifuration des UART?
gelesen ist was (8Bit)?
Wieviele Bits möchtest du denn Übertragen (die 8 Bit des RB0, oder 30 
Bit)?
Wie oft wilst du es Ausgeben?
TIP: füge noch eine CR/LF nach der Ausgabe zu, das macht es einfacher.
Das Senderegister sollte auch ein Flush haben.

von Teo D. (teoderix)


Lesenswert?

Benjamin schrieb:
1
> int i;
2
>     __delay_us(296);
3
> 
4
>     for(i=0; i<30; i++)
5
>     {
6
>
7
      if (i>16 && i<25)
8
         gelesen |= ((i-17) << RB0);
9
>      }
10
           
11
>      printf("%i", gelesen);
12
>      __delay_us(600) ;

O.ä.
Sry, bin C behindert, keine Garantie auf Syntax!

von Thomas E. (picalic)


Lesenswert?

Da kann mann auch nur mit dem Kopf schütteln!

Wenn man das Eingangspost sich mal aufmerksam durchliest, steht da schon 
drin, daß....

kopfschüttel schrieb:
> Also keine Konifuration des UART?
... der UART des PCs quasi als Signalgenerator für ein Testpattern 
verwendet wird.
> gelesen ist was (8Bit)?
... gelesen ist der Pegel an RB0, also logisch nur ein Bit.
> Wieviele Bits möchtest du denn Übertragen (die 8 Bit des RB0, oder 30
> Bit)?
... ihn nur die eingeklammerten Bits 17..24 (also 8 Bit mittendrin) 
interessieren
> Wie oft wilst du es Ausgeben?
... er nichts ausgeben will, sondern einlesen.
> TIP: füge noch eine CR/LF nach der Ausgabe zu, das macht es einfacher.
... das sicher auch nichts hilft
> Das Senderegister sollte auch ein Flush haben.
... und wie gesagt nichts gesendet wird.

von Daniel A. (daniel-a)


Lesenswert?

Woher weisst du, wann die Übertragung anfängt?
Ausserdem sind delays in der ISR keine gute Idee.

von Volker S. (vloki)


Lesenswert?

Benjamin schrieb:
> Letztendlich interessieren mich nur die bit 17-24, die ich mal
> eingeklammert habe.
> Ich hocke jetzt schon ein paar stunden dran und komme einfach nicht
> drauf. Wie bekomme ich diese 8 einzelen bits im richtigen moment in eine
> char oder int geschoben für weitere verarbeitung??

Wenn dich nur die bits 17 bis 24 interessieren, warum dann die Anderen 
überhaupt abtasten?
1
char i, bits17_24;
2
3
delay(bis_in_die_Mitte_17ten_bits)
4
for(i=0; i<8; i++){
5
   bits17_24 << 1;
6
   bits17_24 |= RB0;
7
   delay(1_bit);
8
}
9
delay(bis_zum_ende);

Das mit den Delays ist natürlich nicht so optimal, wenn das Programm 
irgendwann auch noch was anderes tun soll. Besser wäre ein 
Timer-Interrupt, der mit den entsprechenden Zeiten konfiguriert wird.

von Thomas E. (picalic)


Lesenswert?

Noch besser, als per Software und mit Timer Interrupts, wäre natürlich 
gleich den USART des 16F627 zu verwenden (RxD-Pin liegt gleich neben dem 
RB0).

von W.S. (Gast)


Lesenswert?

Benjamin schrieb:
> Ich möchte den Pegel an RB0 auslesen und in ein schieberegister
> schreiben bzw in bytes schieben.
1
   RRF  PortB,W
2
   RLF  MySchieberegister,F

So einfach - und man kann sich's doch nicht merken... (Karl Valentin)

W.S.

von Kopfschüttel (Gast)


Lesenswert?

Thomas E. schrieb:
> Da kann mann auch nur mit dem Kopf schütteln!
>
> Wenn man das Eingangspost sich mal aufmerksam durchliest, steht da schon
> drin, daß....
>
> kopfschüttel schrieb:
>> Also keine Konifuration des UART?
> ... der UART des PCs quasi als Signalgenerator für ein Testpattern
> verwendet wird.
>> gelesen ist was (8Bit)?
> ... gelesen ist der Pegel an RB0, also logisch nur ein Bit.
>> Wieviele Bits möchtest du denn Übertragen (die 8 Bit des RB0, oder 30
>> Bit)?
> ... ihn nur die eingeklammerten Bits 17..24 (also 8 Bit mittendrin)
> interessieren
>> Wie oft wilst du es Ausgeben?
> ... er nichts ausgeben will, sondern einlesen.
>> TIP: füge noch eine CR/LF nach der Ausgabe zu, das macht es einfacher.
> ... das sicher auch nichts hilft
>> Das Senderegister sollte auch ein Flush haben.
> ... und wie gesagt nichts gesendet wird.

1. Du hast in einem Punkt Recht, ich habe Überlesen das er die Bytes am 
PC
Ausgibt.

2. Dadurch meine Verwunderung sowie die folgenden Antworten und 
Ratschläge .....

Asche auf mein Haupt, weiter gehts....

von Peter D. (peda)


Lesenswert?

W.S. schrieb:
> RRF  PortB,W
>    RLF  MySchieberegister,F

main.c:17: error: 'RRF' undeclared (first use in this function)
main.c:17: error: expected ';' before 'PortB'

von W.S. (Gast)


Lesenswert?

Peter D. schrieb:
> main.c:17: error: 'RRF' undeclared (first use in this function)

Na du bist mir aber ein Witzbold.
Bedenke mal, daß es sich hier um eine PIC16F627 handelt...

W.S.

von Peter D. (peda)


Lesenswert?

W.S. schrieb:
> Na du bist mir aber ein Witzbold.

Du aber auch, auf eine C-Frage mit Assembler zu kommen.
"RRF PortB,W" ist keine gültige C-Syntax.

von Volker S. (vloki)


Lesenswert?

Peter D. schrieb:
> Du aber auch, auf eine C-Frage mit Assembler zu kommen.
> "RRF PortB,W" ist keine gültige C-Syntax.

Ja, das sähe dann ungefähr so aus -> asm("RRF PortB,W");

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.