Atmega 8 Port B

TSE

Neues Mitglied
16. Feb. 2009
51
0
0
Sprachen
Hallo,
da ich zurzeit Semesterferien hab, hab ich mir mal ein altbekantes Projekt vorgenommen (ich sag nur LED matrix:vollkommenauf:)
Es werden im laufe des Projekts sicher noch weitere Fragen aufkommen, zurzeit hab ich aber ein anderes Problem.
Es ligt follgender Fall vor;
Daten müssen von µP1 auf µP2 übertragen werden ziemlich zeitkrittisch.
Ich hab jetzt ein meinen code so gestalltet das µP2 über ein Signal (Ausgabe an PINC0) neue Daten anfordert. Die Daten bestehen aus 16 8Bit Variablen.
Ich lasse jetzt von µP1 die Variable an PORTB des µP2 anlegen und dann von µP1 einen Set impulse auf INT0 des µP2 geben. µP2 schreibt die Daten direkt in eine Variable. das ganze 15 mal und fertig.(und schnell)
Jetzt hab ich jedoch bei vorbereitenden Versuchen bemerkt das beim PORTB nur die unteren 6 Bits zu gebrauchen sind:banghead:
So jetzt meine Frage:
gibt es eine möglichkeit entweder den externen interrupt auf einen Pin von PortB zu legen
oder PortB ganz freizuschalten d.h. das da alle 8 Pins zur verfügung stehen
(es wird mit externen Quarz gearbeitet)
 
Hallo TSE!

Ich kann dir jetzt zwar keine komplette Lösung bieten, aber solltest du mit BASCOM arbeiten, dann hilft dir ja vielleicht der Hinweis auf die folgenden Befehle weiter:

Write_port()
und
Read_port()


Damit kannst du Pins verschiedener Ports zu einem ganzen Byte zusammenfassen. ;)


Viel Spaß beim weiteren programmieren!

Gruß,
Cassio
 
Ich programiere in C
Ich hab mal einfach PortD einlesen lassen und direkt an PortB ausgeben.
an PortD 8 Taster geklemmt.
hat alles wunderbar funktioniert nur PinB6 und PinB7 will nichts ausgeben
Hardwareseitig ist alles in ordnung mir ist jedoch aufgefallen das an den beiden Pins der Quarz hängt evlt geht es deswegen nicht:confused:
 
Hallo TSE!

Ups.... im C !
Dann muss ich dich in die andere Abteilung verweisen. ;)

mir ist jedoch aufgefallen das an den beiden Pins der Quarz hängt evlt geht es deswegen nicht

Wenn du einen externen Quarz benutzt, dann sind die Pins natürlich nicht mehr als Eingänge frei!
Die Pins könntest du nur benutzen, wenn du den internen 1MHz Quarz benutzen würdest!


Gruß,
Cassio !
 
gibt es eine möglichkeit entweder den externen interrupt auf einen Pin von PortB zu legen
oder PortB ganz freizuschalten d.h. das da alle 8 Pins zur verfügung stehen
(es wird mit externen Quarz gearbeitet)

damit scheidet möglich keit 2 wohl aus:cool:
 
Hi TSE!

In der Tat!
Die zweite Möglichkeit würde mit externen Quarz dann wohl ausscheiden.


Den extenen Interrupt z.B. INT0 kannst du auch nicht verlegen!
Es gibt aber ggf. die Möglichkeit die anderen Pins zu überwachen und einen Software-Interrupt auszulösen..... wenn dort PCINT0 (oder ähnliches) als "Alternative" am Pin steht (siehe Datenblatt).

Welche(n) Typ(en) µC benutzt du für dein(e) Programm(e) denn?

Wie du das dann aber in C programmierst, müssen dir andere User hier beschreiben. ;)


Grüße,
Cassio
 
Ich wollte eigentlich mit Atmega 8 Arbeiten
werdejedoch falls hier keine lösung gefunden wird auf Atmega 16 umsteigen müssen
überwachen.... sprich zyklischen abfragen kommt eig nicht in frage da das Zeitverschwendung wäre
 
Hallo TSE,

überwachen.... sprich zyklischen abfragen kommt eig nicht in frage da das Zeitverschwendung wäre

Cassio meinte nicht zyklisch abfragen, sondern zum Beispiel den PCINT (PinChangeInterrupt) nutzen. Die Hardware des AVR überwacht dann Portpins.

Wenn möglich, verwende doch einen etwas größeren AVR für den Einstieg in die Programmierung, dann schränkst du dich nicht so ein.

Grüße,
Dirk
 
Und wenn schon externes Quarz dann gelich richtig mit 16MHz. Egal ob Mega8 oder Mega16 oder Mega32, solange Du nicht die L-Variante nimmst und die Megas mit 5V betreibst kannst Du mit vollen 16 MHz fahren und hast dmait Performance ohne Ende :D

Grüße,
Ma
 
Ich hätte halt gerne für dieses Projekt die kleineren 28Pinnigen Atmega 8 hergenommen
Nun gut die atmega 16 sind bestellt wo bei es eigentlich Schade ist den mein Programm lastet (laut avr-Studio) den Speicher des Atmega 8 nur zu 8% aus.:rolleyes:
Ich hatte vor das ganze auf 20Mhz zu fahren:D
Da ich ja noch ein paar Tage Zeit hab bis das Zeug ankommt werde ich mich mal mit Dirk's Stichwort "PinChangeInterrupt" beschäftigen mal schaun was dabei rauskommt
 
Hallo tse,

Ich hatte vor das ganze auf 20Mhz zu fahren:D
Da ich ja noch ein paar Tage Zeit hab bis das Zeug ankommt werde ich mich mal mit Dirk's Stichwort "PinChangeInterrupt" beschäftigen mal schaun was dabei rauskommt
20MHz können die ATmega48,88,168,328
PCINTs können die auch
Die haben allerdings viele Register Memory-Mapped :(

Sie mal hier Register beim Mega48 - Memory Mapped

Im Moment bin ich am stricken der Routinen für den ATmega48

ATmega16,32,.. können kein direktes PCINT für jeden Pin (nach meiner Info)
Es stehen jedenfalls keine PCINT-Angaben an den Pin-Bezeichnungen.
Aber zum einsteigen würde ich den ATmega8535,ATmega16,ATmega32
empfehlen. Die sind auch in Assembler recht gut zu programmieren :D
Und Interrupt-Eingänge haben die auch genug ;)

Gruß
Dino
 
Hallo zusammen,

um Tasten abzufragen, muß man ja nicht unbedingt PCINT verwenden, eine zyklische Abfrage ist doch auch i.O. Hier sollte man nur ein Timingsignal für verwenden, zum Beispiel alle 10ms einmal abfragen, nicht alle 125ns ;)

Dirk
 
Hallo TSE,

sag doch mal ein paar Worte zu den Bits die Du einlesen möchtest und was Du genau damit machst. Gegebenenfalls können wir Dir dann nämlich ein bisschen besser weiterhelfen.

Folgender Gedanke quergedacht:

- Du möchtest an einem Port 8 Bits einlesen und irgendwohin senden.
- Aktuell denkst Du über eine Interrupt-Überwachung oder zyklisches Abfragen nach?
- Wie sieht das Ereignis aus auf das Du prüfen möchtest?
- Ist &B00000000 ein gültiger Wert oder sind gültige Werte min. > 0

Hintergrund meiner Frage ist folgendes:
Wenn Du auf eine zyklische Abfrage verzichten möchtest, der Controller aber kein PCINT zur Verfügung stellt so könnte man sich das mit ein wenig HW selbst basteln. Einfach alle 8 Signalleitungen miteinander verodern und auf den externen INT legen. Wenn nun auf den 8 Bits ein Ereignis eintritt und Du einen Wechsel von NULL auf ???? hast dann kannst Du über das OR am INT-Eingang auf die steigende Flanke triggern, dern Port einlesen und machen, was Du damit machen möchtest. Das würde dann auch mit einem Mega8 gehen.

Vielleicht hab ich auch noch nicht ganz Deinen UseCase verstanden, habe aber bisher nicht mehr Informationen dazu gefunden.

Grüße,
Markus
 
@Dino03
ich programiere alles in C auf Atmega 8 bzw. 16 und da interesiert mich ja das memmory maped nicht oder?
@Dirk
Es geht hier nicht um Tasten abzufragen sonder es werden 2 µP's mit einander verbunden.
µP2 der die entgültige Ausgabe macht arbeitet eine Zeile der Matrix ab
wenn er das hat sendet er ein Signal an µP1 der bis dahin die Daten für die nächste Zeile aufgearbeitet hat (ich arbeite mit RGB) das Wieder eine Zeile übertragen werden soll. Daher empfällt auch zyklisches Abfagen. Der zeitbereich an dem ein Signal anliegen wird ist sehr begrenzt.
µP1 gibt dann an einem Port 8Bit aus die dann direkt an µP2 anliegen.
kurzes Synchronisations NOP
µP1 gibt ans µP2 ein Signal das Daten anliegen.
µP2 schreibt Port direkt in eine Variable
wieder 2,3 NOP's
µP1 gibt neue Variable aus
gibt µP2 wieder Signal das Daten anliegen....
Ich hatte bis jetzt vor dieses Signal auf eine interrupt eingang zu legen und die 8Bit an PortB ....
evlt sollte ich noch erwähnen das INT0 und INT1 beim atmega 8 auf PORTD liegen und der noch dazu der einzige ist der follständig vorhanden ist

ich bräuchte eig nur einen follständigen Port und 2 extra interrupt Eingänge....
gibt es eine möglichkeit die Ports neu zu "aufzubauen" sprich Die PIN's B0-B5 und D6-D7 zu einen neuen Port zusammenzufassen so das ich die ohne größere Kunstgriffe wie normale Ports ansprechen kann?
 
Hallo TSE,

ich meine es könnte schon mal auf einen Versuch ankommen, die Ports zu teilen. Z.B. von einem Port 4 bit und vom anderen Port 4 Bit und die dann mittels AND, SHIFT und OR zusammensetzen. Üblicherweise funktionieren solche Operationen sehr schnell so dass Du hier wenig Zeit verlierst und ggf. kannst Du auch auf Assembler asuweichen.

Hätte folgenden Vorteil:
- du bekommst den Interrupt frei
- du kannst beim Mega8 bleiben den ich maximal mit 16MHz takten würde :D

Was meinst Du?

Grüße,
Markus
 
Das mit and shift und or hab ich als kunstgriff gemeint...
zum takt:
laufen die nicht stabiel mit 20Mhz?
ok sie sind mit 16Mhz ausgeschrieben aber etwas dürfte schon gehen... oder?
 
Hallo TSE,

wenn nur 6Bit eines Ports zur Verfügung stehen, würde ich folgendermaßen vorgehen:

MC1 = sendender Mikrocontroller (Ich gehe davon aus, daß der sendende MC den Master spielt)
MC2 = empfangender MC (also der Slave)
  1. MC1 signalisiert MC2 den Start der Datenübertragung mit Signal an einem externen Interrupt-Pin des MC2 (Beim Atmega8 entweder INT0-PD2 oder INT1-PD3, Interrupt vom AnalogComparator oder vom InputCapture könnte man ggf. auch nutzen).
  2. übertragen wird in der Interruptroutine mit 4Bit-Päckchen (low nibble vom PortB), in der Interruptroutine wird zum Beispiel (!) permanent der Interrupteingangspin überprüft, bei jedem toggel werden 4Bit durchgeschoben.
  3. übernommen werden die 4Bits abwechselnd in low nibble und high nibble eines freien Registers oder Variablen.
  4. das ganze 32mal (16Byte=32x4Bit)
  5. vor dem Beenden der Interruptroutine das Interruptanforderungsflag löschen, fertig.
Ist kein externer Interrupt frei, geht es nur durch pollen. Oder einen anderen Mikrocontroller nehmen, so daß man erstens einen Interrupteingang frei hat und zweitens gleich 1Byte übertragen kann.

In Assembler realisiert schätze ich die Zeit für die Übertragung von 16Bytes mit der oberen Lösung bei 16MHz (62,5ns Zykluszeit) auf knapp 10us ein, kann man immer 8Bit übertragen, dann so auf 5us. Was der C-Compiler draus macht, hängt auch von deinem Code ab.

Interessant wäre, wie schnell die Daten übertragen werden müssen, bzw. die Zeit ab Anforderung der Daten bis zum Start der Datenübertragung, und wie oft angefordert wird.

Dirk
 
Das mit der 4Bit übertragung ist auch eine gute idee....
Übertragen werden 8Bit pro LED
8 (16LED's) pro Zeile
8Zeilen
100 Hz
also 800mal pro Sek müssen neue Zeilen angefordert werden, sprich nicht die Welt
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)