Forum: Mikrocontroller und Digitale Elektronik Attiny841 : Problem REMAP


von Stefan S. (sschultewolter)


Lesenswert?

Hallo,

ich muss auf dem Attiny841 die REMAP Möglichkeit nutzen.
Anstatt PA4 - PA7 nutze ich HW SPI auf PA0 - PA3.
Das hat auch soweit geklappt.
1
#define SPI_REMAP
2
3
#define SPI_DDR    DDRA
4
#define SPI_PORT  PORTA
5
6
#ifdef SPI_REMAP
7
#define SPI_SCK    PORTA3
8
#define SPI_MOSI  PORTA1
9
#define SPI_SS    PORTA2
10
#else
11
#define SPI_SCK    PORTA4
12
#define SPI_MOSI  PORTA6
13
#define SPI_SS    PORTA7
14
#endif
15
16
inline void spi_init(void)
17
{
18
  #ifdef SPI_REMAP
19
  REMAP |= (1<<SPIMAP);
20
  #endif
21
22
  SPI_DDR |= (1<<SPI_SS) | (1<<SPI_MOSI) | (1<<SPI_SCK);
23
  SPI_PORT |= (1<<SPI_SS);
24
  SPCR = (1<<SPE) | (1<<MSTR);
25
  SPSR |= (1<<SPI2X);
26
}
27
28
// Assumed state before call: SCK- Low, MOSI- High
29
void spi_write(uint8_t c) {
30
  SPDR = c;
31
  while(!(SPSR & (1<<SPIF)));
32
}

Jedoch habe ich das Problem, dass ich nun RXD1 und TXD1 auf PA4 und PA5 
nicht nutzen kann. In der main rufe ich vorab spi_init auf. Damit das 
Remap vor der UART kommt. Am Uart kommt jedoch nichts an. Nun ist an den 
Pins PA4 und PA5 auch noch der ATMEL-ICE angeschlossen zum 
Programmieren. Hab ihn abgezogen, aber keine Reaktion.


Nun werde ich aus dem Datenblatt an einem Punkt nicht ganz schlau. In 
der FeatureList werden 2 Full-Duplex USARTs angegeben
sowie ein SPI

Gehe ich der Annahme richtig, dass ich eigentlich USART1 (PA4/Pa5) 
eigentlich nutzen könnte, wenn ich SPI auf die vorderen 4 Bits mappe?

von Cyblord -. (cyblord)


Lesenswert?

Stefan S. schrieb:

> Nun werde ich aus dem Datenblatt an einem Punkt nicht ganz schlau. In
> der FeatureList werden 2 Full-Duplex USARTs angegeben
> sowie ein SPI
Das verstehe ich nun nicht. Feature Liste hin oder her. Das Ding hat 1x 
SPI und 2x USART. Aber es sollte klar sein, dass man mangels Pinanzahl 
nicht alle Features des Bausteins GLEICHZEITIG nutzen kann.

Im Abschnitt IO Ports und dort unter "Alternative Port Functions" 
findest du ALLE Funktionen die ein Portpin haben kann. Inkl. den 
mappbaren.
Im USART und im SPI Abschnitt wird nochmal tabellarisch die REMAP 
Funktion beschrieben und da steht genau welcher Pin welche Funktion hat.

Wenn es da Überschneidungen gibt, dann geht halt nicht beides.

Ich verstehe also das Problem jetzt nicht. Muss man sich jetzt an deiner 
Stelle durch das Datenblatt lesen um dir zu bestätigen oder zu 
widerlegen dass deine gewünschte Kombi tut?

> Gehe ich der Annahme richtig, dass ich eigentlich USART1 (PA4/Pa5)
> eigentlich nutzen könnte, wenn ich SPI auf die vorderen 4 Bits mappe?
Schau halt nach!

: Bearbeitet durch User
von Stefan S. (sschultewolter)


Lesenswert?

Hallo Cyblord,

das habe ich gemacht.

Demnach kann ich USART1 nutzen, wenn ich die Alternative Portfunktion 
(REMAP) nutze. Jedoch bekomme ich dann keinen USART-In/Output mehr. Die 
Leds blinken nicht. Hatte den Atmel ICE angetöpselt, jedoch wieder zu 
einem Test abgezogen. Kann der Atmel ICE da überhaupt "zwischenfunken", 
oder bleibt der für die Restliche Schaltung unsichtbar?

Bei dem Atmel mkII war immer das Problem, dass er den Reset betätigt 
hat, sobald er nicht mehr an USB angeschlossen war.

von Stefan S. (sschultewolter)


Lesenswert?

Kann als gelöst ansehen, hatte eine Konstante beim Senden nicht 
umgeschrieben (UDR0 - > UDR1). Kleiner Fehler große Wirkung

von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

So irgendwie geht das ganze dann doch nicht ;(

Ich habe jetzt mal die Files in ein zip gepackt. SPI ist noch nicht 
einmal initialisiert. Habe jetzt einfach nurmal testweise beide UARTs im 
Einsatz. UART0 geht ohne Probleme. Bei UART1 kommt garnichts raus oder 
rein.

Die Attinys, die ich hier rumliegen hab, haben lediglich die AVR 
Grundschaltung.

- VCC / GND mit 100n Kerko entkoppelt
- 10k PullUp an Reset
- Pins direkt rausgeführt

Habe jetzt mehrere getestet, es kommt nichts. Ich weiß, dass ich die 
Schnittstelle schon einmal im Betrieb gehabt habe, jedoch existiert da 
kein Code mehr von.

RX/TX vertauscht habe ich ebenfalls bereits überprüft. Früher kam über 
die UART1 Schnittstelle ein Datenwirwar, wenn ich am flashen war (zu 
vermuten bei ISP).

Vorher habe ich das mit dem mkII gemacht. Der ist derzeit aber verlegt, 
und mache das mit dem Atmel-ICE über ISP. DebugWire brachte aber auch 
keine Ergebnisse.

Ich habe auch bereits testweise das Adapterkabel vom Atmel ICE 
herausgezogen.



Edit:
Das ist der alte Thread bei den ersten Tests mit dem alten Code
Beitrag "ATtiny841 : UART0"

Da ging es aber um UART0, welcher "Probleme" gemacht hat.

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Guten Morgen Stefan S,

wo ist denn das Makefile dazu ?

von Cyblord -. (cyblord)


Lesenswert?

Was haben denn jetzt eigentlich die UART und SPI Probleme mit dem 
Programmer zu tun?
Irgendwie gehst du doch völlig falsch an die Sache ran. Wenn du eine 
UART in Betrieb nehmen willst, dann schaue doch ob es funktioniert in 
dem zu sie z:B. mit einem USB-TTL Adapter mit dem PC verbindest und per 
Terminalprogramm sehen kannst, was passiert. Oder du schaust mit einem 
LA drauf.

Den UART in Betrieb zu nehmen ist doch wirklich SIMPELST. Du stellst mit 
TXEN und RXEN das Ding an. Stellst mit UBRR die Baudrate ein (mittels 
setbaud.h noch einfacher) und kannst dann sofort mit dem Schreiben auf 
UDR loslegen. Wenn du dann noch davor jedes mal auf UDRE prüfst, ob das 
vorherige Byte raus ist, wird's noch besser. (Registernamen bitte selber 
nachschlagen).

Und wenn das für UART0 oder UART1 unremappt klappt (verifiziert durch 
obige Methoden), dann kannst du REMAP mal versuchen.

Und dafür hält man das Programm MINIMAL. Config des UART und in einer 
Schleife wird ein Byte rausgeschrieben. Bevor das bei dir nicht 
zuverlässig klappt kannst du alles andere vergessen. Ich weiß auch nicht 
warum man dann hier dauern vom mkii und vom Atmel ICE und von debugWire 
lesen muss. Was hat das alles mit deinem Problem zu tun?

Geht mal etwas gezielt an die Problemlösung und mische nicht alles 
durcheinander.

von Stefan S. (sschultewolter)


Lesenswert?

@Cyblord, ich ging davon aus, dass der Programmer, solange eingesteckt 
ist, die Signale "drückt". Ist aber nicht der Fall. An die UART 
Schnittstellen habe ich schon die USB_TTL Adapter drangemacht. Hast du 
dir den Anhang angeschaut, da war eigentlich alles gemacht, was du 
geschrieben hast.

@Karl, ein explizites Makefile hab ich nicht. Ist mit AS7 erstellt. 
F_CPU ist in Symbols der Toolchain auf F_CPU=8000000 gesetzt. Eine UART 
funktioniert ja.

von Bernd (Gast)


Lesenswert?

Ideen:
- Vielleicht sicherheitshalber das  PRR – Power Reduction Register 
beschreiben. Sollte aber defaultmäßig keine Probleme machen. Man muss 
explizit Module deaktivieren.

- Evtl. ein Problem mit den Fuses, da die Pins (PA4 & PA5) auch zum 
Programmieren genutzt werden? Vielleicht musst du SPIEN rausnehmen, dann 
kannst du aber nicht mehr per ISP programmieren...
Ich meine da hätte ich mal was gelesen, konnte es aber gerade im 
Datenblatt nicht verifizieren.

von Cyblord -. (cyblord)


Lesenswert?

Bernd schrieb:
> Ideen:
> - Vielleicht sicherheitshalber das  PRR – Power Reduction Register
> beschreiben. Sollte aber defaultmäßig keine Probleme machen. Man muss
> explizit Module deaktivieren.
Humbug. Wie du schreibst, PRR ist defaultmäßig 0. Da ist nichts 
eingeschaltet bzw. keine Module abgeschaltet.

> - Evtl. ein Problem mit den Fuses, da die Pins (PA4 & PA5) auch zum
> Programmieren genutzt werden? Vielleicht musst du SPIEN rausnehmen, dann
> kannst du aber nicht mehr per ISP programmieren...

Humbug hoch 3. SPIEN muss man natürlich nicht abschalten.

> Ich meine da hätte ich mal was gelesen, konnte es aber gerade im
> Datenblatt nicht verifizieren.
Bitte erst nachschlagen, und dann erst Unsinn empfehlen.

ISP Programmer und UART tun sich normalerweise nichts. Den UART kann man 
mit Serienwiderständen etwas entkoppeln, zur Sicherheit. Am ehesten geht 
das ISP Programmieren nicht mehr, wenn die UART Gegenstelle ihren TXD 
Pin auf einen Pegel zieht.
Praktisch jeder ISP Programmer von Original bis billigst, schaltet sich 
nach dem Programmiervorgang hochohmig. Zum Test reicht ein Rausziehen 
des Programmiersteckers bei Problemen.

Habe den Code noch nicht anschauen können.

Aber läuft dein Controller überhaupt? Blink-LED an weiterem Port könnte 
darüber was aussagen. Und dann kannst du auch gleich den Takt 
verifizieren.
Spannungsversorgung nachgemessen?
Welchen (Ruhe-)Pegel weißt dein TXD Pin am Tiny auf?

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Wie geschrieben waren es nur Ideen denen der Threaderöffner nachgehen 
könnte.
Aber das man hier einen drüber gebügelt bekommt ist ja mittlerweile 
"normal".
Mit ISP habe ich auch noch keine Probleme im Zusammenhang mit dem UART 
gehabt, aber mit JTAG sind schon viele darauf hereingefallen. Habe da im 
Datenblatt zu gesucht, aber bin mir da nicht ganz sicher gewesen, weil 
ich das nur so kenne, dass sich MISO mit TXD einen Pin teilt und MOSI 
mit RXD.
Da kam mir auf PA4 SCK und RXD komisch vor.
Man könnte es ja ausprobieren, ob es daran liegt. Es bleibt ja immer 
noch Debugwire. Und das bei so kleinen Käfern nicht alles gleichzeitig 
geht, ist nicht selten.

Pin ISP  UART1
PA6 MOSI
PA5 MISO TXD1
PA4 SCK  RXD1

von Stefan S. (sschultewolter)


Lesenswert?

Cyblord -. schrieb:

> ISP Programmer und UART tun sich normalerweise nichts. Den UART kann man
> mit Serienwiderständen etwas entkoppeln, zur Sicherheit. Am ehesten geht
> das ISP Programmieren nicht mehr, wenn die UART Gegenstelle ihren TXD
> Pin auf einen Pegel zieht.
> Praktisch jeder ISP Programmer von Original bis billigst, schaltet sich
> nach dem Programmiervorgang hochohmig. Zum Test reicht ein Rausziehen
> des Programmiersteckers bei Problemen.
Das einzige Problem, was mir bekannt ist, mit den orginal mkII ist, dass 
sobald ich den USB Stecker herausziehe(das 6pol. Kabel aber noch 
verbunden ist), der ATtiny nicht aus dem Reset kommt. Das lässt sich 
beim mkII dadurch beheben, dass man nicht nur USB trennt. Beim Atmel-ICE 
hatte ich das Problem nicht.


> Habe den Code noch nicht anschauen können.
>
> Aber läuft dein Controller überhaupt? Blink-LED an weiterem Port könnte
> darüber was aussagen. Und dann kannst du auch gleich den Takt
> verifizieren.
> Spannungsversorgung nachgemessen?
> Welchen (Ruhe-)Pegel weißt dein TXD Pin am Tiny auf?

EXTENDED = 0xFF (valid)
HIGH = 0xD4 (valid)
LOW = 0xC2 (valid)

Der Attiny841 läuft mit der internen 8MHz. Blink-Led war schon dran, hat 
auch funktioniert. Die andere UART Schnittstelle läuft ohne Probleme.

Hallo Bernd, JTAG am Attiny gibt es nicht. Ich habe es mit ISP als auch 
DW getestet. In Verbindung mit dem mkII lief es auch schonmal, siehe 
Link oben von mir, auch wenn da der Code minimal anders war.

Habe bereits ein paar der Teile ausrprobiert, um einen Bauteil/Lötfehler 
auszuschließen. PA4 und PA5 sind sicher rausgeführt. Habe an beiden eine 
Led angebracht und diese zum blinken gebracht, ohne die UART Funktion.

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.