Forum: Mikrocontroller und Digitale Elektronik portb= porta


von Mark Supper (Gast)


Lesenswert?

ich habe folgenden in bascom code geschrieben:
'----------------------
Config Portb = Output
Config Porta = Input

Do
Portb = Porta
Loop
'----------------------

an port b befinden sich leds - die sich auch ansteuern lassen und 
leuchten! leider passiert nichts wenn ich die pins von portA einzeln 
gegen masse ziehe. also muß es wohl am PORTA liegen! was mache ich 
falsch!

sorry bin ein anfänger!
danke

von Reiner (Gast)


Lesenswert?

Wenn's ein AVR ist kannst Du so keine Pegel am PORTx lesen, das geht 
dann über PINx.
Reiner

von Mark Supper (Gast)


Lesenswert?

wie kann ich dann due zustände am port a an port b ausgeben?

von Reiner (Gast)


Lesenswert?

Ich kenne bascom zwar nicht das alles was irgendwie wie BASIC klingt in 
mir Krämpfe verursacht, aber irgendwie wird es wohl
so ähnlich aussehen:

Do
Portb = Pina
Loop

Reiner


Wenn Du von PORTx liest, siehst Du nur was Du vorher mal in das 
Ausgangslatch geschrieben hast, nicht was Außen anliegt. Dafür gibt es 
das PINx Register.

Reiner

von Mark Supper (Gast)


Lesenswert?

Config Porta = Input
Config Portb = Output

Do
Portb = Pina
Loop
End

funktioniert nicht.....! grumml

von Sven (Gast)


Lesenswert?

Ne , ne so geht das nicht....
Wenn du zustände an porta einlesen und an portb ausgeben möchtest geht 
das folgendermaßen:
If Pina.0 = 1 then
set portb.0
else
reset portb.0
end if


Also liegt an port a Highpegel an,
wird b.0 auch auf High gesetzt,
andernfalls,ist pina.0 nicht high
wird auch portb.0 auf Low gesetzt.


Sven

von Mark Supper (Gast)


Lesenswert?

wie kann ich das machen, dann ich z.b. alle zustände über nehmen kann 
oder zb wenn 0001 anliegt das gemacht wird und wenn 1010 anliegt was 
anderes gemacht wird! also praktisch programmausführung je nach dem was 
an pins 0-3 anliegt!
weil wenn ich mit if arbiten soll dann wird das elendlang!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Portb = Pina müsste auf jeden Fall funktionieren. Ich vermute der Fehler 
liegt woanders, probier mal ob es in Assembler geht: 
http://www.mikrocontroller.net/sourcecode/tutorial/leds+buttons.asm

von Mike (Gast)


Lesenswert?

Hallo,

also in assembler machst du so,

in   r16,pina
out  r16,portb

dann geht das was an B anligt gleich an A wieder raus.

Die Eingangszustände kannst du auf eine Sprungtabelle schicken, also du 
liest eine 0B00000001 vom Port nimmst die mal 2 (weil 16 Bit Adresse) 
und machst ICALL oder IJUMP auf Tabelle.

Mike

von Sven (Gast)


Lesenswert?

Hi Mark!

Momente mal. Du schreibst, Du ziehst die Eingänge an PortA nach Masse. 
Dazu brauchst Du ein Pull-Up (Widerstand an PortPins gegen +5V, etwa 10k 
bis 47k), entweder im AVR oder extern, sonst tut sich gar nix.

Das interne Pull-Up machst Du über das PortA-Register, das Du high 
setzt, während das DDRA-Register auf Eingang steht.

Ansonsten ist PortB=PinA schon richtig.

In Assembler etwa so:

ldi TEMP1,0x00
out DDRA,TEMP1  ;Port A => Eingang
ldi TEMP1,0xFF
out PORTA,TEMP1 ;Pull-Ups an
ldi TEMP1,0xFF
out DDRB,TEMP1  ;Port B => Ausgang
ldi TEMP1,0x00
out PORTB,TEMP1 ;Ausgänge low

main:
  in  TEMP1,PINA
  out PORTB,TEMP1
  rjmp main

In BASIC prinzipiell nicht anders, aber ich weiß nicht, wie dort die 
Ports angesprochen werden, Vielleicht so:

Config Portb = Output
Config Porta = Input
Porta = 0xFF           'Pull-Ups an

Do
  Pinb = Porta         'Ausgabe Port A auf Pin B
Loop

Ohne Pull-Ups solltest Du die LEDs flackern sehen, wenn Du mit dem 
Finger an den unbeschalteten Eingang gehst. Die Eingänge sind dann sehr 
hochohmig und die Brummspannung reicht aus, um sie anzusteuern.

Sven (aber ein anderer ;-)

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.