SBUS-Switch

cool - dann muss ich ja mal etwas Gas mit der aktuellen Version geben.
Ich will noch eine Servofunktion einbauen.
Die Version 2.2.0 (Beitrag 54) funktioniert ja sehr gut, solange man bei den Jetiempfängern keine langen Frame-Zeiten einstellt.
Updaten kannst Du ja jetzt selbst
 
Moin
Wenn ich darf, würde ich etwas vorschlagen.
Habe mal für den AVRooltloader Bootloader auf das Prjekt mit den Attiny4313 angepasst. (PD6 8MHz...)
Wenn der Bootloader einmal drauf ist, kann das Ganze danach einfach über das Servokabel geflasht werden (ähnlich wie bei den Reglern), und muss nicht ständig an den ISP.
Als Adapter funktionieren naehzu alle gängen 1wire Modellbauteile, Graupner, Jeti BLHeli u.s.w.

AVRootl.png


Ein weiterer Vorteil, man könnte ein Menü für den PC über das EEprom aufbauen, um Nutzereinstellung zu machen. Für ein einfaches Menü ist alles im Programm AVRootloader schon enthalten.
Beispiel (hier ein MPP Attiny 44)
AVRootloader.png





Die angehängte Hex einmal mit den Fuses l:E4 h:9F e:FE flashen
(Das e:FE ist wegen selfprogn wichtig, der Rest muss halt auf 8MHz hinauslaufen).

Zum brennen über den ISP oder das File direkt nutze ich den AVRDUDESS, das empfinde ich auch als einfacher.
Oder direkt inkl Fuses (hier it dem 1,2€ teuren USBTiny Programmer, der für sowas bestens funktioniert).
avrdude -c usbtiny -p t4313 -b 19200 -U flash:w:"Boot_4313_PD6_lE4_h9F_eFE.hex":a -U lfuse:w:0xE4:m -U hfuse:w:0x9F:m -U efuse:w:0xFE:m

Im Anhang auch der Code für den One-Wire Adapter auf Nano/Uno Basis, One-Wire Pin ist D3.
Das .txt bei den Anhänge wegwischen ....

Ich hoffe ihr könnt es gebrauchen :-)
 

Anhänge

Vergessen...
Der Attiny hat USI (Universal Serial Interface). USI kann auch direkt ohne viel Gewürge wunderbar SBUS auslesen, da eh über einen Pin Hardware Interrupt gesteuert wird, ist es USI egal das das SBUS-Signal aufem Kopp steht. (darum brauchts am USART ja immer den Transistor, oder mal puzzelt es ein).
Das Gewürge mit Hirnknoten ist dann das auseinanderpuzzeln der empfangenen Bytes. Es steht dann nicht wie üblich nur aufem Kopp (1 ist 0), sondern zusätzlich auch noch verkehrt herum im Byte (Bit 0 ist 7 - und Bit 7 ist Null), ansich ists egal, da es eh Bitweise auseinandergefusselt werden muss (8zu111Bit....).

Irgendwo müsste ich den Code dazu noch haben, wenn es interessiert. Für den Attiny44. (Beim Attiny4313 gab es aber USI Probleme, da hierfür der PCINT0 am DI-Pin zuständig ist, und der gerne zickig sein möchte (bekannter Fehler im Compiler beim 4312). - dafür könnte man mit einem Drähtchen zum Hardware INT0 oder INT1 legen, würde zusätzlich noch die Flankenabfrage sparen).


Aber 2021:)
Es gibt die neuen Series 1/2 Attinys mit 8/14/20Pins. Die Teile kosten um die 50Cent, und habenvon Haus aus einen 1Wire Pin (UPDI) einen XMega Kern drauf. Es gibt einen Inverter für jeden Pin, den aktiviert man, und kann so direkt SBUS über den ganz normalen USART einlesen.
Wenn Interesse, kann ich mal meinen teil-fertigen Code dafür teilen (einlesen läuft bereits, das Randzeug wie Failsave u.s.w. fehlt noch).
 
Zuletzt bearbeitet:
Hallo Holger
Danke für Deine Anregungen.
das mit dem Bootloader schaue ich mir mal an.
Zum Einlesen des SBUS-Signal nutze ich die Soft-Serial von BASCOM. Da hat sich also ein anderer das Hirn verrenkt.....
Auf die neuen ATTinys habe ich auch schon einen Blick geworfen. Die gibt es leider nur in SMD-Bauweise. Ich überlege aber trotzdem das Projekt auf eine andere Plattform zu heben, da die neuen ATinys deutlich mehr Ressourcen haben, mit denen man noch einige Funktionen realisieren könnte.

Ulf
 
Moin Ulf

Mein halbfertiger SBUS-Lesecode für die neuen Attinys, Comiliert habe ich mit https://github.com/SpenceKonde/megaTinyCore

C:
uint8_t count,timeout,INBYTE[30];
uint16_t Ch[16];

void setup() {
PORTB.PIN3CTRL |= PORT_INVEN_bm;          // Rx Eingangsignale invertieren
USART0.BAUD =800;                         // 100.000bps SBUS für 20MHz
USART0.CTRLA |= USART_RXCIE_bm;           // RX ISR ON
USART0.CTRLB |= USART_RXEN_bm;            // RX aktivieren
}

void loop() {
  delay(1);
  timeout++;
  if(timeout>4){  count=0;
    for (uint8_t BBit=0, CBit=0, i=0; i<176; i++, BBit++, CBit++) {
      if(INBYTE[i/8+1] & _BV(BBit)) Ch[i/11+1] |= _BV(CBit); else Ch[i/11+1] &= ~_BV(CBit);
      if(BBit > 6) BBit=255;
      if(CBit > 9) CBit=255;
    }
} }

ISR(USART0_RXC_vect){
  INBYTE[count] = USART0.RXDATAL;
  timeout=0;
  count++;
}






Inkl Servos,
für Series 0/1 Attinys muss der Serial debug raus, da die nur ein UART haben. Der ganz neue Attiny1624 hat ja 2 x UART :-)

C:
#include <Servo_megaTinyCore.h>
Servo SERVO_1;Servo SERVO_2;Servo SERVO_3;Servo SERVO_4;Servo SERVO_5;

uint8_t count,timeout,INBYTE[30];
uint16_t Ch[16];

void setup() {    Serial1.begin(115200);  // Serialdebug nur beim Attiny 1624/3224 (mind. 2xUSART)
PORTB.PIN3CTRL |= PORT_INVEN_bm;          // Rx Eingangsignale invertieren
USART0.BAUD =800;                         // 100.000bps SBUS für 20MHz
USART0.CTRLA |= USART_RXCIE_bm;           // RX ISR ON
USART0.CTRLB |= USART_RXEN_bm;            // RX aktivieren
SERVO_1.attach(0);SERVO_2.attach(1);SERVO_3.attach(2);SERVO_4.attach(3);SERVO_5.attach(6);
}

void loop() {
  delay(1);
  timeout++;
  if(timeout>4){  count=0;
    for (uint8_t BBit=0, CBit=0, i=0; i<176; i++, BBit++, CBit++) {
      if(INBYTE[i/8+1] & _BV(BBit)) Ch[i/11+1] |= _BV(CBit); else Ch[i/11+1] &= ~_BV(CBit);
      if(BBit > 6) BBit=255;
      if(CBit > 9) CBit=255;
    }
  SERVO_1.writeMicroseconds((Ch[1]>>1)+1000);
  SERVO_2.writeMicroseconds((Ch[2]>>1)+1000);
  SERVO_3.writeMicroseconds((Ch[3]>>1)+1000);
  SERVO_4.writeMicroseconds((Ch[4]>>1)+1000);
  SERVO_5.writeMicroseconds((Ch[5]>>1)+1000);
  Serialdebug();
} }


ISR(USART0_RXC_vect){
  INBYTE[count] = USART0.RXDATAL;
  timeout=0;   count++;
}

//Nur beim Attiny 1624/3224 (mind. 2xUSART)
void Serialdebug(){ //nur At1624
  for (uint8_t i=1;  i<5; i++) {
    Serial1.print((Ch[i]>>1)+1000);
    Serial1.print("\t");}
    Serial1.println();
}
 
Zuletzt bearbeitet:

ttt126

User
Ich hab da noch eine Frage. Wie ist die Belegung des Codeschalter. Hab so ein Ding noch nie benutzt. Habe einen
KMR 16 Rotary encoder switch besorgt.
Hat 6 Pins, die Mittleren 2 sind wohl zusammen geschaltet. In der Anleitung ist dazu keine Belegung deffiniert. Oder ist es egal welche Ausgänge wie auf den Attiny gehen ? Grüße Thomas
 
Hallo Thomas,
ist natürlich nicht egal.
Der Code-Switch gibt auf den 4 Pins einen Binär-Code aus 0-15 / 0000-1111
Ich konnte Deinen Code-Switch nicht auf die Schnelle finden. Musst mal ins Datenblatt schauen. Die 4 Pins sind mit 1,2,4,8 bezeichet.
In meinem Schaltplan:
Code 0 = 1
Code 1 = 2
Code 2 = 4
Code 3 = 8
GND = C (Deine beiden Mittleren)

Werde ich für die nächste Version der Anleitung mal anpassen
 

ttt126

User
So, habe erfolgreich einen Switch am laufen. Hat alles gut geklappt. Da ich ihn für ein Schiff gebaut habe ist er etwas größer geworden. Wenn man ihn im Betrieb an der Unterseite berührt hat ein kurz ein Schluckauf. Alle Schaltkänale gehen aus, wenn man loslässt fängt er sich gleich. Evt. kann man da noch etwas zur stabilität machen . Erst mal vielen Dank für die tolle Anleitung und Arbeit.
 
schön zu hören, dass es geklappt hat.
Kannst ja mal Bilder vom fertigen Modell im Einsatz hier posten

Wenn man ihn im Betrieb an der Unterseite berührt hat ein kurz ein Schluckauf.
so was macht man ja auch nicht !
Vermutlich hast Du auf Pin 1 des AVR herumgetatscht. Verbinde mal Pin 1 über einen 10K-Widerstand mit Pin 20 (+)
Im "normalen" Betrieb läuft der auch ohne zusätzlichen Widerstand absolut stabil.
 
Oben Unten