Forum: Mikrocontroller und Digitale Elektronik ATmega8 Resetpin oder RxD/TxD


von Profitroll (Gast)


Lesenswert?

Servus,

ist es möglich den Resetpin (PC6) als Ausgang zu benutzen, aber seine 
Resetfunktion trotzdem zu behalten? Alternativ würde auch noch Port D 
gehen, wenn dadurch aber UART nicht gestört werden kann.

µC: ATmega8
Benutzt werden: 1 ganzer Port (wahrscheinlich B) und von einem anderen 
Port 7 Pins. Da würde sich natürlich Port C perfekt eignen, da er genau 
7 Pins hat. Allerdings ist einer davon eben der Resetpin.

Ich vermute, dass ich ihn nicht benutzen kann.

Dann bliebe noch Port D. Da sind aber die beiden Pins für RxD und TxD. 
Hätte ich nichts einzuwenden, wenn UART ständig verfügbar sein kann, 
obwohl die Pins (oder zumindest einer) benutzt werden.

Die dritte Möglichkeit was sicher geht, ist einfach einen Pin vom 
anderen Port benutzen. Z.B. PD6 statt PC6. Möchte ich persönlich nur 
machen, wenns gar nicht anders geht, da es einigen zusätzlichen 
Programmieraufwand mit sich bringt.

Was wie geschalten werden soll, kommt über UART in den EEPROM und wird 
von dort ausgelesen und durchlaufen.

Welche Lösung ist also die Beste?

von oldmax (Gast)


Lesenswert?

Hi
Warum so kompliziert? Natürlich kannst du mischen. In Assembler ist das 
vielleicht ein Aufwand von 4 -8 Zeilen. Wenn du dir ein kleines UP für 
die Ausgabe schreibst, dann kannst du dieser Routine ein Byte übergeben. 
In der Routine trennst du es wie gewünscht auf. Ich sehe da kein 
Problem. Ich denke aber, du hälst dich daran fest, einfach immer ein 
Byte ausgeben zu müssen, weil's schöner ist. Mittlerweile richten sich 
die Programmierer mehr nach dem (einfacheren ) Layout.
Ich halt es auch so. Ein Aufruf
1
Read_Port
 liefert mir bspw. ein Byte Read_In und die Folge
1
LDS Set_Out, Register
2
Write_Port
setzt die Portpins der verschiedenen Ports. Wenn die Routinen zum Lesen 
noch am Anfang der Loop-Schleife des Hauptprogrammes stehen und die 
Zuweisungsroutine am Ende aufgerufen wird, hat man eine saubere 
Struktur.
Gruß oldmax

von S. T. (cmdrkeen)


Lesenswert?

der resetpin ist ziemlich wichtig für die serielle programmierung ... 
wenn du deinen µC HV-parallelprogrammieren kannst, kannst du auch den 
reset sowie serielle programmierung abschalten und den resetpin als IO 
benutzen ... (ich bin mir nur nicht ganz sich ob es nicht noch spezielle 
regelungen in der benutzun des pins dann geben)

es hatte mich aber auch oft gestört nie einen kompletten 8bit PORT auf 
dem ATmega8 benutzen zu können... da gewöhnt man sich drann ... eine 
ausgabefunktion die einem dann das sendebyte bitweise auf die 
ausgangsbits verteilt schafft abhilfe...
Problem: erhöter Speicherbedarf, erhöter Prozessorzeitaufwand

von Profitroll (Gast)


Lesenswert?

>Ich denke aber, du hälst dich daran fest, einfach immer ein
>Byte ausgeben zu müssen, weil's schöner ist.
Nein. Es wird sowieso jeder Pin extra geschalten, es geht mir da 
eigentlich nur im die einfachere Zuordnung.

>der resetpin ist ziemlich wichtig für die serielle programmierung ...
Genau das ist der Grund warum ich frage, ob die Resetfunktion trotz 
Benutzung noch funktionsfähig bleibt. Aber wie es scheint, geht es wohl 
nicht.

Über UART sende ich eine Ziffer die dann für den betreffenden Pin steht.
Bsp: PORTB |= (1 << empfangene_ziffer); // (vereinfacht)

Dann werde ich aber vermutlich eine Abfrage für Pin 6 einbauen. Ist ja 
nicht viel Aufwand mehr, mir ging es nur um das mögliche mit dem 
Resetpin. Lieber fragen, bevor man am Ende ISP nicht mehr geht.

Thx euch.

von oldmax (Gast)


Lesenswert?

Hi
Profitroll schrieb:
>Nein. Es wird sowieso jeder Pin extra geschalten, es geht mir da
>eigentlich nur im die einfachere Zuordnung.

Einfachere Zuordnug für's Programmoder Layout? Anhand meiner Frage 
erkennst du, das "einfacher" relativ ist. In Programm kannst du so 
einfach bleiben wie du magst, lediglich das Unterprogramm, welches nun 
deine Bits auf die Ausgänge verteilt, muß die Zuordnung machen. Auch die 
Eingänge können so verstreut liegen, wie sie wollen, innerhalb des 
Programmes hast du sie in einem Byte, eben durch eine entsprechende 
Routine.
In Assembler kann ichs erklären:
1
Mein_Ausgangsbyte:    . Byte ; Bit 0 = Port C 2
2
                             ; Bit 1 = Port C 3
3
                             ; Bit 2 = Port B 5
4
                             ; Bit 3 etc.
5
Mein_Eingangsbyte:    . Byte ; Bit 0 = Port B 2
6
                             ; Bit 1 = Port B 3
7
                             ; Bit 2 = Port D 0
8
                             ; Bit 3 etc.
in einem Unterprogramm sammelst du nun die Portbits ein und setzt die 
entsprechenden Bits in Mein_Eingangsbyte. Diese Routine rufst du am 
Anfang deiner Programmschleife auf. Anschließend arbeitest du nur mit 
der Variablen.
Das selbe gilt für die Ausgänge. Das Unterprogramm zerlegt die Variable 
Mein_Ausgangsbyte und setzt die entsprechenden Portbits. Dieses UP rufst 
du am ende deiner Programmschleife auf. Innerhalb deines Programmes 
arbeitest du nur mit der Varialen. Nun ist das Layout "einfach" und das 
Programm " einfach ".
Gruß oldmax
Gruß oldmax

von Hc Z. (mizch)


Lesenswert?

Wie willst Du denn eine 0 ausgeben oder einlesen, solange der Resetpin 
seine Funktion als Reset behält?  Ohne PSI kommst Du da nicht weiter, 0 
V sind nunmal 0 V.

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.