PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Portsignale verwerten



Bonestruca
09.07.2005, 14:57
Hu,

so, nochmal ich :)

Ich bekomm, da ich ja nun meinen Port B auf empfang schalten kann, dort folgendes Signal herein:

PB4 sagt an ob Informationen da sind, die verwertet werden können oder nicht.

PB0 bis PB3 "codieren" die information. das heißt bei ihnen bekomme ich immer solche muster rein:

0100
1001
0110
1010

etc. pp.
jede reihenfolge steht für eine andere information.
wie werte ich das jetzt programmiertechnisch aus ? kann ich einfach fragen if(PB0=1){ ...
und dann auch so nach dem rest oder ist das komplizierter ?
Am Ende möchte ich es so haben, dass, immer wenn PB4 nen high pegel hat, die informationen der anderen PB0-PB3 ausgelesen werden und ich dann eine aktion anschließen kann. wie sieht das ungefähr aus und wie mache ich das am besten ?

Dankeschön für eure Hilfe.

PicNick
09.07.2005, 16:12
Naja, könnte sein:


if (PINB & (1<<PB4)) // pin 4 high ?
{
switch (PINB & 0x0F) // PB0-3 maskieren
{
case 4: // 0100
...
break;
case 9: // 1001
...
break;
case 6: // 0110
...
break;
case 10: // 1010
...
break;
}
}


die punkte stehen für eine aktion

Hilft das ?

Bonestruca
10.07.2005, 02:05
hmm, klappt nix.
hab die vermutung dass bei portb garnix reinkommt.
habs mal mit dem code versucht:


unsigned char i;
unsigned char x;


sens_setLED(0,1);
sens_setLED(1,1);


i=PINB;


while (20<40){
x=PINB;


if (i!=x) // pin 4 high ?
{



sens_setLED(0,0);
sens_setLED(1,1);


}}

um zu schauen ob sich auf PINB oder PORTB (hab beides schon versucht) überhaupt was ändert. aber anscheinend passiert nix. lichter bleiben beide an :( gibt es noch irgendeine möglichkeit nachzuschauen ob das auf B überhaupt was ankommt ?

linux_80
10.07.2005, 02:29
hmm, klappt nix.
hab die vermutung dass bei portb garnix reinkommt.
....
um zu schauen ob sich auf PINB oder PORTB (hab beides schon versucht)....

da muss ich doch erstmal fragen, ist der Port auf Eingang eingestellt (DDRB) ?
Dann muss mit lesen von PINB auch was zu sehen sein, und interne Pullups de-/aktivieren (mit PORTB).

Bonestruca
10.07.2005, 03:01
man hat mir gesagt dieser port sei automatisch auf eingang geschaltet. ich hab nämlich außerdem ein dummes problem. ich habe 2 compiler, benutze ich compiler und avr libraries nr 1. kann ich den portb nicht auf eingang schalten weil kommt: invalid lvalue. bei compiler und avr library nr.2 klappt das prima. jedoch bekomme ich hier immer diese fehlermeldung:
undefined reference to 'sbi'
undefined reference to 'cbi'
:(

Bonestruca
10.07.2005, 03:09
so, das mit den undefined references hab ich in den griff bekommen und den portb auf eingang geschaltet.

ich benutze jetzt folgenden code, und trotzdem bleiben beide led's an.


DDRB = 0xFF;

uint8_t i;
uint8_t x;

sens_setLED(0,1);
sens_setLED(1,1);

i=PINB;

while (20<40){
x=PINB;

if (i!=x) // hat sich was geändert ?
{

sens_setLED(0,0);
sens_setLED(1,1);

}}

wo könnte da ein fehler drin liegen ? oder besser, wie kann ich anhand 2 led's die ich ansteuern kann prüfen ob auf portb was ankommt ? gibt es noch eine andre methode als jene stupide, die ich oben verwende ? und wenn ja, wie schaut der code ?

danke, danke, danke, danke für eure hilfe.

Kjion
10.07.2005, 09:12
so, das mit den undefined references hab ich in den griff bekommen und den portb auf eingang geschaltet.
...
DDRB = 0xFF;

Nein! Port B ist bei dir ein Ausgang. Dann ließt du mit Pin B nur den Zustand des Registers PORTB!


DDRB = 0x00;
Wäre da wesentlich besser :-)

Was soll den die komische while Schleife ?? 20<40 ist doch immer erfüllt. Da kannst du doch gleich while(1) schreiben.

MfG Kjion

PicNick
10.07.2005, 09:13
Mit
DDRB = 0xFF;
setzt man das Port auf OUTPUT
DDRB = 0x00;
wäre input

Bonestruca
10.07.2005, 11:53
ok, super, jetzt empfang ich was auf dem port b.
wie frage ich jetzt aber ab ob die einzelnen dinger von PB0 bis PB4 was empfangen ?

reicht es da wenn ich schreib
if(PB0==1){ ....

oder wie mache ich das ?
danke !

// EDIT //

Hab das jetzt mal so geschrieben:

sens_setLED(1,1);

while(1){
if ( PINB & (1<<PINB0) ) {
sens_setLED(1,0);
}

wenn pinb0 also logisch auf 1 gesetzt ist geht die lampe aus. so, habs gleich ausprobiert, die led geht aber schon aus bevor ich irgendwas sende. sofort, zack. gleiches spiel mit den andren PB0 bis PB4, was hab ich jetzt schon wieder falsch gemacht ? :(

Bonestruca
10.07.2005, 15:19
problem behoben, ich hatte den roboter die ganze zeit am kabel des Pc's gelassen und das hat da irgendwie alles durcheinander gebracht. entstöpselt und nu gehts :)