Forum: Mikrocontroller und Digitale Elektronik Fragen zu Digispark pro - USB und VirtualWire


von Ralphi M. (ralphi_m)


Angehängte Dateien:

Lesenswert?

Hi all,
jetzt hab ich (endlich) 2x Digispark pro bekommen.
Hier ist anscheinend schon ein Bootloader vorkonfiguriert. Die blinken 
bereits nach dem Anschluss vom USB vor sich hin.

Als SDK hab ich mir
https://github.com/digistump/DigistumpArduino/releases/download/v1.5.8C/DigistumpArduinoInstall1.5.8C.exe
geladen.
Erste Verwirrung:
Nach Anschluss an Win10-USB sehe ich keinen Com-Port. D.h. ich komme mit 
Putty & Co gar nicht drauf.
Allerdings mit dem o.g. Arduino SDK, kann ich ohne Probleme mit 
Datei->Hochladen, einen Sketch brennen. komisch.
Kann mir das jemand erklären?
Ich würde gerne auch über den USB (zB. Sensor-)Daten abfragen können.

Der UART auf TX digitalpin 7 und RX digitalpin 6, funktioniert auf 
anhieb:
Über die Befehle:
1
Serial.begin(9600);
2
.. data_in = Serial.read();
3
.. Serial.write(data_in);
kann ich mit einem Host gut kommunizieren.

Allerdings, wenn ich Daten von einem anderen µC (zB. ATTiny45) über 
433MHz mit VirtualWire sende, bekomme ich keinerlei Daten rein.
Ich benutze die selbe Library für Sender und Digispark als Empfänger mit 
digitalpin 5 als Datapin für 433MHz-Receiver, wo auch der Datenstream 
physikalisch ankommt (mit Oszzi gekuckt).
// in der loop:
1
uint8_t buf[VW_MAX_MESSAGE_LEN]; 
2
uint8_t buflen = VW_MAX_MESSAGE_LEN;
3
if (vw_get_message(buf, &buflen)) {   
4
  for (int i = 0; i < buflen; i++) {
5
    Serial.write(char(buf[i]));
6
  }
7
  blinki(2); // LED blinkt 2x
8
}
9
// ** ZUR Kontrolle ob UART funktioniert **
10
if (Serial.available() > 0) { // Das funktioniert !!
11
  blinki(1); // LED blinkt 1x
12
  data_in = Serial.read();
13
  Serial.write(data_in);
14
} //If Serial.available

Welchen Fehler mach ich?
Kann es was mit dem CLK zu tun haben (ATTiny45 8MHz / Digipark 16MHz)?
Grüße aus LA
ralphi

von Stefan F. (Gast)


Lesenswert?

Das Ding hat einen USB Bootloader aber keinen USB-UART. Der Serielle 
Port des Mikrocontrollers für zu den Anschlüssen RX und TX - nicht zum 
USB Port.

Das ist anders, als beim Arduino Nano bzw Uno.

Und ja, ungenaue oder gar falsche Taktfrequenz kann Ursache für 
Fehlfunktion der seriellen Kommunikation sein. betreibst du die 
Gegenstelle (ATtiny) mit R/C Oszillator oder Quarz? Serielle 
Kommunikation mit R/C Oszillator hängt ein bisschen vom Glück ab - 
klappt meistens, aber nicht immer.

Jedenfalls muss die Taktfrequenz nicht die selbe sein, aber die Baudrate 
muss auf beiden Geräten die selbe sein. Hast du auf beiden Seiten die 
Baudrate gleich eingestellt und die tatsächliche Taktfrequenz richtig 
vorgegeben?

Dafür gibt es bei AVR Projekten die Definitioan F_CPU - keine Ahnung, 
wie das bei Arduino heisst.

von Ralphi M. (ralphi_m)


Lesenswert?

Danke für die rasche Antwort :-)
OK - also irgenwie so:
Man müsste sich einen neuen Bootloader schreiben und die Register 
umleiten - also ein USB-SoftwareUART bauen mit Vendor und Product ID.
Wie auch immer: Mit dem UART auf 6/7 komm ich auch zurecht :-)

Für den ATTiny45 nutz ich den internen CLK 8MHz.
Der Flankenabstand am Ausgang ist (bei diesem Tiny) ziemlich genau 
4,0msec. Damit ausreichen genau - oder?
Das Sendersignal und Empfängersignal sind bei den Frequenzen (am Oszzi) 
eigentlich identisch.

Welche Möglichkeit hab  ich den, den ext. 16MHz CLK beim Digispark 
intern auch auf 8MHz runterzubrechen?
Kann es sein, dass VirtualWire immer den SystemCLK statt bit/s nimmt?
Also 8MHZ = xbit/s und 16MHz = 2xbit/s.

von Stefan F. (Gast)


Lesenswert?

> also ein USB-SoftwareUART bauen

Richtig.

> Für den ATTiny45 nutz ich den internen CLK 8MHz.

Der R/C Oszillator kann ein paar Prozent von der Nennfrequenz abweichen. 
Schau mal im Datenblatt für welche Temperatur und Spannung der interne 
R/C Oszillator kalibriert ist. Diese Betriebsbedingung solltest du dann 
auch einhalten.

Die Ungenauigkeit des R/C Oszillators zusammen mit Verzerrungen durch 
die Funkübertragung können durchaus dazu führen, dass die Kommunikation 
gar nicht funktioniert. Als Ausweg kannst du den R/C Oszillator selbst 
neu kalibrieren (dazu gibt es eine Application Note von Atmel) oder 
einen Quarz verwenden.

> ziemlich genau 4,0msec. Damit ausreichen genau - oder?

Wenn ziemlich genau ausreichen genau ist, dann ja. Wie genau ist denn 
Ziemlich genau? Atmel empfiehlt maximal 2% Abweichung.

> Welche Möglichkeit hab  ich den, den ext. 16MHz CLK beim
> Digispark intern auch auf 8MHz runterzubrechen?

Keine, das ist auch nicht nötig. Ledigleich der Baudraten-Generator 
(UBBR) muss dort mit einem anderen Wert initialisiert werden. 
Normalerweise macht man diese Berechnung mit einem Precompiler Makro. 
Ich weiss nicht, wie deine Library die Werte für das UBBR register 
berechnet - kenne mich mit Arduino Software nicht aus.

> Kann es sein, dass VirtualWire immer den SystemCLK statt bit/s nimmt?

Warscheinlich nicht, aber das musst du in der Dokumentation von 
VirtualWire nachlesen.

Wenn du mit den 4ms die Breite eine Bits am seriellen Port meinst, dann 
wären das nur 250 Baud. Kommt mir seltsam wenig vor, und zudem ist es 
noch eine "krumme" nicht standarisierte Baudrate.

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.