Software Serial für mega644

Gast #6622594
Lesenswert?

Ich nutze bisher das Beispiel von 
https://rn-wissen.de/wiki/index.php/Software-UART_mit_avr-gcc um Daten 
zu senden und zu empfangen. Beim Wechsel auf einen 644 stoße ich an 
meine Grenzen.
Senden klappt.
Beim Empfang ist RX an Pin PB0. Das ist jetzt aber nicht mehr der ICP 
(InputCapture-Eingang). Kann ich PCINT8 dazu nutzen? Und wenn: wie?

Danke
Beitrag #6622779 wurde von einem Moderator gelöscht.
Gast #6622803
Lesenswert?

Ist doch egal Leute. Ich will einfach einen seriellen Software-UART an 
einem (bel.) Pin realisieren. Wie ist mir egal. Die Frage ist, wie ich 
beispielsweise den o. g. Code passend für PCINT8 anpassen kann.
Beitrag #6622828 wurde von einem Moderator gelöscht.
Gast #6622849
Lesenswert?

PS:
Wie offenbar richtig erkannt wurde, wird es ohne Input-Capture ziemlich 
ungenau, daraus folgt eine gewisse Einschränkung, was die Baudrate, in 
Bezug auf den Systemtakt (sowie eventuell vorhandene andere, sperrende 
Interrupts), betrifft.

> Ich weiß halt nicht, wie man die auswertet
Direkt zu Beginn der PCINT-ISR TCNT statt ICR lesen - aber siehe oben.
Gast #6622851
Lesenswert?

John Doe schrieb:
> Der gute Stefan wieder: Einfach sinnlos drauflosposten, ohne vorher
> gelesen zu haben. Alles wie gehabt.

HTML Fragender schrieb im Beitrag #6622828:
> Kennt man doch, laberrhababer

Erstens habe ich hier lediglich ein Datenblatt zitiert, das auflistet, 
welche Varianten zwei UART haben. Ich habe ganz bewusst darauf geachtet, 
dass die Titelzeile gut sichtbar ist.

Zweitens wisst ihr genau so wenig wie ich, welche Variante des ATmega644 
der TO vorliegen hat.

Drittens hat der TO längst geantwortet, dass es ihm nicht um die UART 
Schnittstellen geht. Was soll also dieses unnötige Nachtreten?
Gast #6622875
Lesenswert?

Stefan ⛄ F. schrieb:
> John Doe schrieb:
>> Der gute Stefan wieder: Einfach sinnlos drauflosposten, ohne vorher
>> gelesen zu haben. Alles wie gehabt.
>
> HTML Fragender schrieb im Beitrag #6622828:
>> Kennt man doch, laberrhababer
>
> Erstens habe ich hier lediglich ein Datenblatt zitiert, das auflistet,
> welche Varianten zwei UART haben. Ich habe ganz bewusst darauf geachtet,
> dass die Titelzeile gut sichtbar ist.

Bleib bitte bei der Wahrheit: Du hast mein - korrektes - Posting zitiert 
und dann Bilder von einem anderen Controller hinzugefügt. Insofern ist 
Deine damit bezweckte Aussage schon eindeutig.

> Zweitens wisst ihr genau so wenig wie ich, welche Variante des ATmega644
> der TO vorliegen hat.

Es gibt nur einen ATmega644. Punkt. Von etwas anderem hat der TO nicht 
geschrieben. Ich poste jetzt auch nicht Bilder vom Datenblatt eines 
STM32H7, nur weil der Poster ja einen Fehler gemacht haben könnte und 
den gemeint haben könnte.
Das Forum wäre sinnlos, wenn jetzt jeder anzweifelt, dass ein TO nicht 
dazu in der Lage ist, eine vernünftige Frage zu stellen und daher 
irgendwas da reininterpretiert.

> Drittens hat der TO längst geantwortet, dass es ihm nicht um die UART
> Schnittstellen geht. Was soll also dieses unnötige Nachtreten?

1. Es ist kein Nachtreten
2. Es ist nicht unnötig. Du unterstellst mir - siehe oben - dass ich was 
Falsches geschrieben hätte. Wollte ich nur klarstellen.
Moderator Persönliche Seite #6622883
Lesenswert?

Stefan ⛄ F. schrieb:
> Juno schrieb:
>
>> PCINT8 ist doch ein Interrupt oder?
>
> Ja schon, aber du hast doch zwischenzeitlich deine Anforderung so
> ergänzt:
> Juno schrieb:
>
>> Ich will einfach einen seriellen Software-UART an
>> einem (bel.) Pin realisieren.

Die "moderneren" AVRs, welche PCINT-Interrupts zur Verfügung stellen, 
machen das dann auch in der Regel an fast jedem Pin. Schau Dir im 
Datenblatt vom ATMega644 das Pinout an: Du findest fast an allen Pins 
die Bezeichnung "PCINTxx", nämlich an allen GPIO-Pins.
Moderator Persönliche Seite #6622911
Lesenswert?

Juno schrieb:
> Die Frage ist, wie ich beispielsweise den o. g. Code passend für PCINT8
> anpassen kann.

Lies Dir einfach das Kapitel 11 im Datenblatt zum 644er durch, dort ist 
das erklärt.

Da gibt es für die PCINTs folgende Register:
1
PCICR – Pin Change Interrupt Control Register
2
PCIFR – Pin Change Interrupt Flag Register
3
PCMSK3 – Pin Change Mask Register 3
4
PCMSK2 – Pin Change Mask Register 2
5
PCMSK1 – Pin Change Mask Register 1
6
PCMSK0 – Pin Change Mask Register 0

Neben PCICR und PCIFR brauchst Du für PCINT8 noch PCMSK1.

Zitat:

" Bit 7:0 – PCINT15:8: Pin Change Enable Mask 15..8

Each PCINT15:8-bit selects whether pin change interrupt is enabled on 
the corresponding I/O pin. If PCINT15:8 is set and the PCIE1 bit in 
PCICR is set, pin change interrupt is enabled on the corresponding I/O 
pin. If PCINT15:8 is cleared, pin change interrupt on the corresponding 
I/O
pin is disabled."

Analog zu PCMSK3 - PCMSK0 gibt es auch die entsprechenden 
Interrupt-Vektoren PCINT3 - PCINT0. Für Deinen Wunsch, es mit dem Pin 
auf PCINT8 umzusetzen, brauchst Du eine Interrupt-Routine für den Vektor 
PCINT1 - analog zu PCMSK1.

Eigentlich nicht schwierig, oder?
#6622912
Lesenswert?

Man kann ja einen schnellen Timerinterrupt laufen lassen und zB mit 
4fachem Oversampling die Bits reinziehen.

Ich meine aber, der Aufwand fuer einen Software Uart ist die Muehe nicht 
wert. Wenn ich 2 Uarts haben will, verwende ich den 644, eigentlich ist 
das der Kleinste, welchen ich verwende. Und wenn ich mehr Uarts haben 
will, nehme ich den 2560. Die anderen machen wenig Sinn. Das erarbeiten 
eines Software Uarts kann einen Tag dauern. Das kostet soviel wie 
wieviele der groesseren Mega ? Um welche Serie geht es ?
Gast #6622913
Lesenswert?

> ohne Input-Capture ziemlich ungenau
Also wenn man weiß, wieviel Zeit vergeht vom Interrupt bis zum Lesen von 
TCNT, dann kann man das ja herausrechnen (ist wohl abhängig von der 
Compiler-Einstellung für Optimierung). Dann bleibt nur noch die 
(eventuelle) Unwägbarkeit anderer ISRs sowie von Programmteilen mit 
gesperrtem Interrupt.
Gast #6622935
Lesenswert?

Juno schrieb:

> Ist doch egal Leute. Ich will einfach einen seriellen Software-UART an
> einem (bel.) Pin realisieren.

Der Ansatz ist Mist. Software-UART für Empfang ist arg limitiert, wenn 
man nicht wenigstens andere Hardware-Features wie etwa ICP als Krücke 
verwendet.

> Wie ist mir egal. Die Frage ist, wie ich
> beispielsweise den o. g. Code passend für PCINT8 anpassen kann.

Am besten: Garnicht. Die UART wird nichtmal annähernd so gut 
funktionieren wie die Vorlage. Es sei denn, der für PCINT8 zuständige 
Interrupt wäre der einzige erlaubte Interrupt im System, dann 
funktioniert das recht fluffig. Den durchlaufenden Timer zur Zeitmessung 
brauchst du aber trotzdem.

Wenn also der eigentliche Plan war, den Timer frei zu bekommen: kannste 
vergessen.
Moderator Persönliche Seite #6622942
Lesenswert?

c-hater schrieb:
> Wenn also der eigentliche Plan war, den Timer frei zu bekommen: kannste
> vergessen.

Eben, ohne Timer geht es nicht. Ich weiß nicht, welche Baudraten der TO 
verwenden will. Ich habe aber auf einem ATMega mit 16MHz schon mal acht 
Software-UARTs mit 9600 Bd realisiert - zugegebenermaßen nur für RX. 
Dabei wurde auf einen PCINT verzichtet und lediglich der 8-Bit-Port 
28800 mal pro Sekunde über eine Timer-ISR gepollt - also mit der 
dreifachen Datenrate.
Gast #6623024
Lesenswert?

Frank M. schrieb:

> Ich habe aber auf einem ATMega mit 16MHz schon mal acht
> Software-UARTs mit 9600 Bd realisiert - zugegebenermaßen nur für RX.
> Dabei wurde auf einen PCINT verzichtet und lediglich der 8-Bit-Port
> 28800 mal pro Sekunde über eine Timer-ISR gepollt - also mit der
> dreifachen Datenrate.

Schon das ist nicht sehr zuverlässig. Sobald ein oder sogar mehrere 
konkurrierende Interrupts im System sind, ist recht schnell Ende 
Gelände, selbst bei nur 9,6kbps...
Gast #6623200
Lesenswert?

Frank M. schrieb:
> - also mit der dreifachen Datenrate.

Whow, das ist vom Timing her ja optimal!

Wenn im Takt 1 von 3 das Start, dann Samplen bei 2 und restart im Stopp 
bei 3.

Damit bist Du ja auf 1/6 bitzeiten am Optimum! Respekt!! Ich glaube, da 
wäre ich nicht drauf gekommen.

Danke.
Gast #6623210
Lesenswert?

c-hater schrieb:
> Sobald ein oder sogar mehrere konkurrierende Interrupts im System sind,
> ist recht schnell Ende Gelände, selbst bei nur 9,6kbps...
Klar. Aber wenn das Dingen high prio hat, dann ist das eine Zeile C-Code 
mit höchster Priorität, immer an:

a[idx++]=Port;

Das geht sogar vielleicht per DMA.

Und die Auswertung hat dann bis zu 255 Samples Zeit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren