C Paralleles abfragen von Ports

Rolfkatt

Neues Mitglied
27. Juli 2013
8
0
0
Leipzig, Germany
Sprachen
  1. ANSI C
Hallo Zusammen,

ich bin auf der suche nach einer Möglichkeit an meinem Mega2560-USB aus dem Onlineshop die kompletten Ports PF, PE und PK in C direkt abzufragen und weiter zu verarbeiten. Das ganze wird in einem Pinball eingesetzt um Taster und Targets auszuwerten. Der Controller soll dann via USB dem PC sagen welcher pin von welchem Port gedrückt wurde. Da die Kugel nur sehr kurz ein Target berührt muss dies schnell abgehandelt und weitergeleitet werden. Im PC gibt es eine Konfigurationsdatei in der die Ports und Pins eingetragen sind und auf Punkte gematcht werden.

Gegebenenfalls sendet der PC auch ein Commando an den uC zurück um zu signalisieren das ein weitere ball eingeschossen werden muss für ein Multiballspiel.

Wie kann ich das am besten umsetzen, welche Möglichkeiten habe ich zur Verfügung.

Viele Grüße Rolf
 
Möchtest du nur die Änderung eines Pin übertragen oder den ganzen Port?
Grundsätzlich geht das mit dem Pin-Change-Interrupt.
Von der Geschwindigkeit her hast du sicher keine Probleme, eher das mehrere Interrupts ausgelöst werden weil der Kontakt prellt.
 
Hallo zusammen,
Grundsätzlich geht das mit dem Pin-Change-Interrupt.
Von der Geschwindigkeit her hast du sicher keine Probleme, eher das mehrere Interrupts ausgelöst werden weil der Kontakt prellt.

ja genau, PinChangeInterurpt könnte man verwenden.

Eventuell könnte man das aber auch mit polling machen (polling = permanent manuell die Portpin Register lesen und prüfen) und dann bei einer Änderung die Werte der entsprechenden Portpins via Uart zum PC übertragen. Das muss wahrscheinlich garnicht mal so schnell erfolgen, vielleicht reichen hier 10ms (würde auch gegen Prellen wirken).

Dirk :ciao:
 
Hallo zusammen,

Danke für die schnellen antworten :)

Bekomme ich beim PinChangeInterrupt auch mit welcher port uns welcher pin gedrückt wurde?

Kann ich das prellen durch einen kondensator verhindern ?
 
Du bekommst je Port einen Interrupt, wenn du mehrere Pins aktiviert hast, musst du maskiert abfragen.
Wieviele Pins wären denn zum Überwachen?
Wenn es nur einige wenige sind, ist Pollen, wie schon erwähnt, nicht langsamer.
 
Ich habe gerade noch mal im Datenblatt nachgeschaut, PinChange-Interrupt gibt es nur von den PortB, PortJ und PortK.
Von den anderen Pin müsstest du ohnehin Pollen.

Grüße Hubert
 
Hallo Hubert,

dann ist Pollen definitiv besser. Denn es können auch 4 Ports sein die ich benötige. Wie stell ich dies am geschicktesten / performantestem an ? Und wie identifiziere ich welcher pin von welchem port getroffen wurde ?
 
Hallo Rolf,

unabhängig von der Programmiersprache:

(1) Pins als Eingang mit Pullup-Widerstand aktiviert initialisieren (Port Register PORTn, Data Direction Register DDRn, ggf. muss JTAG durch Fusebit JTAGEN deaktiviert werden)
(2) USART initialisieren

(3) Hauptprogramm (Endlosschleife)



Im Hauptprogramm (Endlosschleife)

- alle Ports pollen, Werte ggf. merken und beim Nächsten pollen vergleichen
- falls es neue Informationen für den PC gibt, dann diese senden (hier müsstest du eventuell ein kleines Protokoll anwenden, damit der PC weiß, wann das Datenpaket anfängt)
- Pause 10ms (zum Beispiel, vielleicht prellt nichts und du musst hier nicht weiter per Software oder Hardware entprellen)


Dirk :ciao:
 
Hallo Dirk,

so in etwa habe ich es gelöst allerdings habe ich Probleme mit dem Bits setzen und löschen. Ich habe 2 Taster und am Schieberegister 2 LED`s dran.
Drücke ich Taster 1 geht LED 1 an drücke ich Taster 2 geht LED 2 an. Lasse ich einen Taster los geht die LED nicht aus. :(

Code:
	while(1)
	{
		if (get_targetsl_press())
		{
			if(tempPress != targetsl_state)
			{
				tempPress = targetsl_state;
			}	
			if(tempPress == 0b00000001)
			{
				uart3_putc('l');
				spi_master_transmit(0b00000001);
				spi_master_latch();
			}
			else if (tempPress == 0b00000010)
			{
				uart3_putc('r');
				spi_master_transmit(0b00000010);
				spi_master_latch();
			}
			else if (tempPress ==0b00000011)
			{
				uart3_putc('b');
				spi_master_transmit(0b00000011);
				spi_master_latch();
			}
			else
			{
				
			}

			uart3_puts(itoa(targetsl_state, s, 10));  // in s maximal 3 Zeichen plus abschließende 0
			uart3_putc('\n');
			
		}
 
Laut dem Code solltest Du aber zumindest die leuchtende LED umschalten können. Ich finde aber nirgends die Stelle, wo Du 0b00000000 senden läßt.

Was spricht gegen: "spi_master_transmit(tempPress)" statt der Fallunterscheidungen?
 
Hi,

das wäre auch eine idee, wo müsste ich denn das 0b00000000 senden ? in meinem Ifstatement ?

gruß Rolf
 
ständig, solange keiner gedrückt ist, oder nur einmal, wenn losgelassen wird?
Hmm... C kann ich nicht, aber ich interpretiere das mal so:
get_targetsl_press() ist eine Funktion, die 'ne 1 liefert, wenn ... was?
dann prüfst Du, ob temp_press verschieden targetsl_state ist, also ab sich eines der Bits geändert hat. Wenn ja, machst Du 'ne Fallunterscheidung (die eine, die andere oder beide Taster gedrückt) - der Fall "jetzt kein Taster gedrückt" (also Taster losgelassen) taucht als möglicher Fall aber nicht auf.

Wie gesagt: warum sendest Du nicht nach der Abfrage tempPress!=targetsl_state? tempPress (sondern eben wenn TempPress=1 sende 1, wenn tempPress=2 sende2, wenn TempPress=3 sende 3 (wenn TempPress=0 sende 0) Hätte dasselbe Resultat mit weniger Code und Rechenzeit...
 

Ü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)