Attiny85 Geschwindigkeitsproblem?

Hallo @ all,

Ich habe folgendes Vorhaben:

Mit einer Funkfernsteuerung (Hype ST6DF) möchte ich eine Kamera ein und aus schalten. Der Empfänger der Steuerung gibt aber nur ein PWM Signal aus.

Der einfachheit halber habe ich mir das PWM in beiden Endlagen des Steuerknüppels und in Nullstellung angeschaut.

--------____usw. HIGH = 2ms Hebel oben
---
---usw. HIGH = 1,5ms Hebel mitte
_____--
_--______usw. HIGH = 1ms Hebel unten

Da die HIGH momente sehr Kurz sind habe ich mich entschlossen die LOW momente an zu schauen 18ms, 18,5ms, 19ms

Jetzt habe ich mit dem Mega angefangen und getestet.
Ging alles Problemlos. Per Serial.print Kamen saubere Werte über die Leitung und die Kamera lies sich auch bedienen.

Also habe ich das Programm soweit an den Attiny85 angepasst und es per ArduinoISP rüber geschaufelt.

Jetzt ging garnix mehr. also hab ich dem Tiny ne softserial verpasst und mir die Werte angeschaut. Leider schwanken die jetzt so dermaßen das der komplette Bereich bei jeder Hebelstellung abgedekt wird.

Ich habe jetzt zum Probieren vieles am Code geändert. Aber ich denke das Prinziep ist zu erkennen.

Bitte sagt mir das hier ein Fehler drin ist und nicht das der tiny zu lahm ist dafür :wink:

Ach ja der Tiny läuft 8Mhz Intern

wäre toll wenn einer ne Idee hat und die kund tut.
Danke und Gruß derRobert

#include <SoftwareSerial.h>
#define rxPin 1
#define txPin 2


unsigned long timestamp1 = 0;
unsigned long timestamp2 = 0;
int timestamp3 = 0;
boolean LOWmerker=false;
int wert = 0;

SoftwareSerial serial(rxPin, txPin);
unsigned long test= timestamp3;

void setup(){

  pinMode(0,INPUT);
  pinMode(3,OUTPUT);
  digitalWrite (3, LOW);
   serial.begin(4800);
  serial.println("ATtiny85 Software serial");
}


void loop(){

 if(timestamp3 != test){
   serial.print ("TS3=");serial.println(timestamp3);
 test= timestamp3;}
 
 
  wert = digitalRead(4);

  if(wert==LOW && LOWmerker==false){ 
    timestamp1=micros();
    LOWmerker=true;  
  }


  if(wert==HIGH && LOWmerker==true){
    timestamp2=micros();
    LOWmerker=false;  
  }
  
timestamp3= timestamp2 - timestamp1;

  switch (timestamp3){
  case 190:
  rc1();
    break;
  case 180:
    rc2();
    break;
    default:
    digitalWrite(3,LOW);
  
  }


}
void rc1()
{
  digitalWrite(3, HIGH);
  delay(10);
  digitalWrite(3, LOW);
  timestamp2=0;
    timestamp3=0;
 
}

void rc2()
{
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(3, LOW);
  timestamp2=0;
    timestamp3=0;
  
}

Ohne näher den Code zu durchleuchten. Du nutzt delays und software Serial die beiden "dinge" belasten den Tiny doch enorm. Kannst du nicht den Code so minimalistisc h auf dem Tiny halten wie nötig untersuchen mit einem ander Arduino das Tun des Tinys loggen. Ich denke das ein Tiny af 8MhZ das eigentlich schaffen müsste. Du bist dir sicher das in den Fuses der CLK/8 nicht gesetzt sind?

Zu den delays kommt er je erst wenn er mal die micros() gezählt hat. dann soll er eine Funktion durchlaufen und dann wieder zurück in die Loop dort gibts ja dann keine delays.

das serial habe ich ja erst wieder rein genommen als keine reaktion vom tiny kam. also musste ich ja schauen welchen wert die variable annimmt. Wüsste nicht wie ich den sonst herausbekomme

Habe vorm ersten beschreiben den Tiny85 8Mhz intern als Board ausgewählt und mit der Funktion "TOOLS/Bootloader installieren" eingestellt.

Das sollte doch so korrekt sein und den Tiny auf 8Mhz intern gestellt haben

So Problem gelöst.

Code ist sogar kleiner geworden und er sendet trotzdem Munter und fröhlich seine Seriellen Daten und die Delays durften auch bleiben.

Warum selber zählen wenn da schon jemand eine Funktion erstellt hat? pulseIn() war hier das Zauberwort

#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 4
SoftwareSerial serial(rxPin, txPin);

unsigned long timestamp2 = 0;
int timestamp3 = 0;



void setup(){

  pinMode(2,INPUT);
  pinMode(0,OUTPUT);
  digitalWrite (0, LOW);
   serial.begin(4800);
}


void loop(){

timestamp3= pulseIn(2,LOW);
timestamp2= timestamp3 / 100;
 serial.println(timestamp2);
 



  switch (timestamp2){
  case 193:
  rc1();
    break;
  case 185:
    rc2();
    break;
  }


}
void rc1()
{
  digitalWrite(0, HIGH);
  delay(300);
  digitalWrite(0, LOW);
 
}

void rc2()
{
  digitalWrite(0, HIGH);
  delay(3000);
  digitalWrite(0, LOW);
  
}

Binäre Sketchgröße: 3.686 Bytes (von einem Maximum von 8.192 Bytes)
Könnte man echt drüber nachdenken den tiny45 zu nehmen :wink:

Deine switch auswertung ist ziemlich strikt.
"case 193" könnte doch auch "case dauer >190 AND <195 heissen".

Ausserdem verstehe ich nicht warum du die funktionen rc1 und rc2 hast, wenn doch beide das gleiche tun?

rc1 schaltet Ein ->Kurzer impuls delay(300)
und
rc2 schaltet aus mit langem impuls delay(3000)

Bei betätigung der Fernbedienung bekomme ich einen festen wert und daher ging das so.
Natürlich kann man da ein größeres fenster geben. Jetzt isses aber schon gelötet und in schrumpfschlauch verpackt.

wenns probleme damit gibt werd ich ma die ISP strippen anlöten und das noch ändern.

Gruß derRobert

wieso dann nicht ein rc (short delay);? sparts du dir noch ein paar bytes

Weis nicht was mit rc short delay gemeint ist?

wollte gerade das "case dauer >190 AND <195" umsetzen aber beim kompilieren meckert er wegen des < und des >

Wie ist denn da die korrekte syntax bzw kann switch case überhaupt vergleichen????

oder muss ich 2 if´s nehmen?

Gruß derRobert

Marcus meint, du sollst eine Funktion schreiben, der du als Parameter die Dauer übergeben kannst, der Parameter soll vom Typ short sein.

Bzgl. dem case: das kann nur Literale vergleichen, wenn du Bereiche vergleichen willst, dann musst du das mit if lösen

Beispiel:

if (dauer > 190 && dauer < 195)
{
  ...
}

Es reicht aus, wenn du eine Funktion rc() erstellst und ihr als Wert die Dauer der Pause übergibst. Also

rc(300); // kurze Pause
rc(3000); //lange Pause

switch-case kann soweit ich weiß nur genau prüfen, nicht über einen Bereich. Zwei if brauchst du nicht, es gibt ja logische Verknüpfungen. && ist dann wohl die passende AND-Verknüpfung: größer 190 UND kleiner 195. :smiley:

Klingt interessant.
hab mit Funktionen noch nicht so viel gearbeitet.
habe jetzt folgenden Ansatz zur Lösung umgesetzt.

Den Serial Kram habe ich nach Funktionsprüfung auskommentiert und komme somit auf

Binäre Sketchgröße: 1.346 Bytes (von einem Maximum von 8.192 Bytes)
//#include <SoftwareSerial.h>
//#define rxPin 3
//#define txPin 4
//SoftwareSerial serial(rxPin, txPin);

int timestamp = 0;

void setup(){
  pinMode(2,INPUT);
  pinMode(0,OUTPUT);
  digitalWrite (0, LOW);
 // serial.begin(4800);
}

void loop(){
timestamp= pulseIn(2,LOW)/100;
// serial.println(timestamp2);
 
if (timestamp>194){//serial.println("up");
rc1();}
if (timestamp<189 && timestamp>170){//serial.println("down");
rc2();}
}

void rc1()
{
  digitalWrite(0, HIGH);
  delay(300);
  digitalWrite(0, LOW); 
}

void rc2()
{
  digitalWrite(0, HIGH);
  delay(3000);
  digitalWrite(0, LOW);
}

Das mit der Funktion werde ich mir mal anschauen.
Nicht weil es mir um die zu sparenden Byte´s geht sondern um zu Lernen.

Danke und Gruß
derRobert