Der AVR-/ARDUINO-Faden

Der chaotische Hauptfaden

Moderatoren: Sven, Heaterman, TDI, Finger

Re: Der AVR-/ARDUINO-Faden

Beitragvon xoexlepox » Di 13. Feb 2018, 13:23

Die Sekundenzählung kann man doch sicher in einer Funktion abfertigen? Hat jemand eine Idee?

Hast du eine "left" oder "substr"-Funktion, die von einem String die linken N Zeichen abschneidet? Dann kannst du ein Array mit den kompletten 60 Zeichen füllen, und nur die Anzahl Zeichen ausgeben, die dein Sekundenzähler angibt. Eine andere Variante wäre eine Schleife, die bis zum Sekundenzähler läuft, und bei jedem Durchlauf ein Zeichen ausgibt. Ist der Schleifenzähler durch 5 teilbar (" i%5 == 0" ) wird ein "|" ausgegeben, sonst ein '.'.
Benutzeravatar
xoexlepox
 
Beiträge: 4290
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Der AVR-/ARDUINO-Faden

Beitragvon Anse » Di 13. Feb 2018, 14:12

Code: Alles auswählen


void draw_sec_bargraph(int S)
{

display.setCursor(0, 15);

   for(i=0;i<S;i++)
  {
       if(!(i%15))//Wen durch 15 teilbar dann Maker
       {
         Diplay.print("|");
       }
        else//Sonst Punkt
       {
         Diplay.print(".");
       }
    }
//ggf. den Bereich der noch leer bleibt "aufräumen"
    for(i=0;i<(128-S);i++)
   {
    Diplay.print(" ");
   }
}

//END





Es gäbe noch einen etwas komplexeren Ansatz, der nicht immer alles neu Zeichnet.
Anse
 
Beiträge: 1118
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl

Re: Der AVR-/ARDUINO-Faden

Beitragvon Heaterman » Mi 14. Feb 2018, 05:42

Vielen Dank für die Antworten. War der richtige Denkanstoß. Nach Anpassung hat Anses Code geklappt - vielen Dank!
Benutzeravatar
Heaterman
 
Beiträge: 2846
Registriert: Fr 28. Jun 2013, 10:11
Wohnort: Am Rand der Scheibe, 6 m unter NN

Re: Der AVR-/ARDUINO-Faden

Beitragvon Heaterman » Do 22. Feb 2018, 07:45

Nächste Hürde bei meiner Wortuhr, Zuweisung von festen Texten bei bestimmten Zeiten. Sorry, Gelegenheitsprogrammierer halt, aber ich partout eine deutsche Wortuhr auf einem Display statt LED-Matrix zusannenbauen.

Hab ich so versucht:
Code: Alles auswählen
if (m == 25 && h == 0 || h == 12) goto label1;


  if (m == 25 && h == 1) goto label2;

  {
label1:
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Es ist  F \232 n f   vor");
    display.setCursor(3, 9);
    display.print("H a l b   E i n s" );
  }
  {
label2:
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Es ist  F \232 n f   vor");
    display.setCursor(3, 9);
    display.print("H a l b   Z w e i" );
  }
}


Aber hier geht die Anzeige nach Start der Uhr genau auf die Anzeige von Label2 und bleibt da. Wo hab ich jetzt die Klammern falsch gesetzt?
Oder kann man da besser ein Array oder sogar eine lib bilden, was man abfragt? Aber wie geht sowas?

Die Alternative war, jede einzelne in Frage kommende Anzeige mit if...print... platt auszugeben, funktioniert, aber das übersteigt sofort den Speicher des AVRs. Die goto-Methode spart enorm Speicher, aber wo hab ich mich da verrannt?
Benutzeravatar
Heaterman
 
Beiträge: 2846
Registriert: Fr 28. Jun 2013, 10:11
Wohnort: Am Rand der Scheibe, 6 m unter NN

Re: Der AVR-/ARDUINO-Faden

Beitragvon manuel » Do 22. Feb 2018, 07:57

Der geht schon zu label 1, aber darunter ist label 2 und der part wird auch ausgeführt. Das heisst dein display zeigt ganz kurz fünf von halb ein an, uns dann fünf vor halb 2, so schnell das du es nicht siehst.

Aber mal im ernst willst du jede Permutation von Stunde und Minute einzeln behandeln ? Erstmal sind Stunde und Minute unabhängig, kann also anstatt mit quadrat nur mit Faktor 2 gebastelt programmiert werden, und noch einfacher wärs wenn du die stunden und minuten/5 direkt als look up index inner Tabelle nimmst.
manuel
 
Beiträge: 320
Registriert: Fr 7. Feb 2014, 00:14

Re: Der AVR-/ARDUINO-Faden

Beitragvon ferdimh » Do 22. Feb 2018, 09:36

Die goto-Methode spart enorm Speicher, aber wo hab ich mich da verrannt?

Die interessante Fragestellung ist eher, warum die Goto-Methode Speicher spart. Das sollte sie eigentlich nicht...
Durch Aufteilung des Ganzen in "es ist x vor/nach" und halbe Stunden sollte sich der Code aber ausreichend verkleinern lassen, dass das in den Speicher passt.
Benutzeravatar
ferdimh
 
Beiträge: 5950
Registriert: Fr 16. Aug 2013, 15:19

Re: Der AVR-/ARDUINO-Faden

Beitragvon xoexlepox » Do 22. Feb 2018, 16:21

Code: Alles auswählen
if (m == 25 && h == 0 || h == 12) ...

Uhhh.... Ich weiß, es gibt eine "operator precedence", ich hätte aber heftige Probleme nun zu sagen, wie diese Zeile wirkt ( was passiert z.b. bei m=24 und h=12 ?). Bei verschiedenen Operatoren in einer Zuweisung/Bedingung setze ich grundsätzlich entsprechende Klammern -> Es erleichtert zumindest das Lesen des Codes ;)
Benutzeravatar
xoexlepox
 
Beiträge: 4290
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Der AVR-/ARDUINO-Faden

Beitragvon Heaterman » Do 22. Feb 2018, 18:01

:oops: :oops: Ja, ich bin so ein Spaghettiprogrammierer, man sieht auch immer wieder, dass ich aus der BASIC-Ecke komme, :mrgreen:

Ich werde das mal nach ferdis Vorschlag neu sortieren...
Benutzeravatar
Heaterman
 
Beiträge: 2846
Registriert: Fr 28. Jun 2013, 10:11
Wohnort: Am Rand der Scheibe, 6 m unter NN

Re: Der AVR-/ARDUINO-Faden

Beitragvon sysconsol » Mo 12. Mär 2018, 20:34

Ich habe eine RTC Typ DS1302Z hier liegen.
Der Code vom User Krodal im Arduino-Playground funktioniert,
wenn er direkt in der Sketch liegt.

Nun wollte ich aus dem Code eine Bibliothek machen.
Die Definitionen samt Deklarationen in eine Header-Datei, die Funktionen in eine cpp-Datei.
Schrieb man im Roboternetz.
Aber was mache ich mit der Struktur?
Code: Alles auswählen
typedef struct ds1302_struct


Das Setzen der Zeit über
Code: Alles auswählen
memset ((char *) &rtc, 0, sizeof(rtc));

hätte ich in eine Funktion verbaut und mit in die cpp-Datei gelegt.

Ich denke, da fehlt mir etwas Wissen zu den C++-Gerüsten :oops:
sysconsol
 
Beiträge: 1320
Registriert: Fr 8. Jul 2016, 17:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon Heaterman » Mo 12. Mär 2018, 20:49

Warum nimmst Du keine fertige Bibliothek, z. B. die von Adafruit?

Ich fingere auch gerade an dem Problem mit dem Stellen rum. Momentan stelle ich den RTC durch einen ganz kurzen Sketch über das Terminal, da kann man die Verzögerung fürs Hochladen einrechnen. Danach kommt das normale Programm auf den AVR und ernährt sich vom zuvor gestellten RTC.
Normalerweise holt man ja per lib die Zeit zum Zeitpunkt des Compilierens vom Rechner, aber das ist eben ungenau, je nach Länge des Compilierens/Hochladens. Noch besser würde ich ein manuelles Stellen des RTC per Hardwaretasten finden, aber das hab ich noch nicht raus. Aber solange die Batterie für den RTC geht, reicht ja eigentlich das Stellen per Terminal.
Benutzeravatar
Heaterman
 
Beiträge: 2846
Registriert: Fr 28. Jun 2013, 10:11
Wohnort: Am Rand der Scheibe, 6 m unter NN

Re: Der AVR-/ARDUINO-Faden

Beitragvon sysconsol » Mo 12. Mär 2018, 21:24

Weil keine andere funktioniert.

Edit 20:56: Gerade noch etwas gefunden, was funktioniert: https://github.com/msparks/arduino-ds1302
sysconsol
 
Beiträge: 1320
Registriert: Fr 8. Jul 2016, 17:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon Sir_Death » Di 13. Mär 2018, 00:09

naja. bei 1302 und 1307 kann man fast gleich weg lassen. - mehrere Minuten pro Tag sind keine Seltenheit. Nimm doch eine 3231

https://forum.arduino.cc/index.php?topic=377472.0
und die Lib geht jedenfalls: https://github.com/JChristensen/DS3232RTC

EdIt: Zahlendreher..
Sir_Death
 
Beiträge: 1524
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitragvon sysconsol » Di 13. Mär 2018, 10:01

Mit der bereits oben schon verlinken DS1302-Bibliothek von msparks habe ich noch ein Verständnisproblem.

Ich möchte die Zeit setzen - per Terminal.

Das Beispiel macht das in der Sketch wie folgt (ohne Terminal):
Code: Alles auswählen
// Make a new time object to set the date and time.
// Sunday, September 22, 2013 at 01:38:50.
   Time t(2013, 9, 22, 1, 38, 50, Time::kSunday);
   rtc.time(t); // setzt die Zeit


Im Headerfile steht dazu:
Code: Alles auswählen
// Class representing a particular time and date.
class Time {
 public:
  enum Day {
    kSunday    = 1,
    kMonday    = 2,
    kTuesday   = 3,
    kWednesday = 4,
    kThursday  = 5,
    kFriday    = 6,
    kSaturday  = 7
  };

  // Creates a Time object with a given time.
  //
  // Args:
  //   yr: year. Range: {2000, ..., 2099}.
  //   mon: month. Range: {1, ..., 12}.
  //   date: date (of the month). Range: {1, ..., 31}.
  //   hr: hour. Range: {0, ..., 23}.
  //   min: minutes. Range: {0, ..., 59}.
  //   sec: seconds. Range: {0, ..., 59}.
  //   day: day of the week. Sunday is 1. Range: {1, ..., 7}.
  Time(uint16_t yr, uint8_t mon, uint8_t date,
       uint8_t hr, uint8_t min, uint8_t sec,
       Day day);

  uint8_t sec;
  uint8_t min;
  uint8_t hr;
  uint8_t date;
  uint8_t mon;
  Day day;
  uint16_t yr;
};


Ich habe dann versrucht, per Terminal
- einen String einzulesen -> funktioniert
- in Teilstrings zu zerlegen -> funktioniert
- die Teilstrings in uint8_t zu konvertieren -> funktioniert

Nur mit dem Day komme ich nicht klar.
Folgende Codeschnipsel aus dem Sketch:

Die Eingabe am Terminal zum Setzen lautet (\n -> newline-character)
Code: Alles auswählen
set20180313090100Tuesday\n

Das kommt auch so im String temp an.

Es folgt
Code: Alles auswählen
Serial.println(temp); // Eingabe anzeigen zwecks Kontrolle, zum Jahr hin muss eine freie Zeile sein!!
// Eingabe zerschneiden in einzele Strings und diese zu uint8_t konvertieren
jahr = temp.substring(3, 7).toInt();
monat = temp.substring(7, 9).toInt();
tag = temp.substring(9, 11).toInt();
stunde = temp.substring(11, 13).toInt();
minute = temp.substring(13, 15).toInt();
sekunde = temp.substring(15, 17).toInt();

temp = temp.substring(17); // Tagesname mit newline in temporären String ablegen
// Länge Tagesname mit newline ermitteln   
// newline brauchen wir nicht mehr
// newline abschneiden, nur den Tagesnamen behalten   
temp.remove((temp.substring(17).length()) - 1);
wochentag = String("k" + temp); // dem Tagesnamen ein "k" voranstellen (siehe enum Day in Headerfile)

// so war das gedacht, funktioniert jedoch nicht:
// Time t(jahr, monat, tag, stunde, minute, sekunde, wochentag);
// no matching function for call to 'Time::Time(uint16_t&, uint8_t&, uint8_t&, uint8_t&, uint8_t&, uint8_t&, String&)'

// so geht es auch nicht:
// Time t(jahr, monat, tag, stunde, minute, sekunde, Time::wochentag);
// 'wochentag' is not a member of 'Time' --> logisch, nur: wie drücke ich aus, dass der Inhalt von "wochentag" eingesetzt werden soll?
   
// so funktioniert das prinzipiell, nur der Wochentag lässt sich nicht setzen:
Time t(jahr, monat, tag, stunde, minute, sekunde, Time::kTuesday);
rtc.time(t);
   
// auch folgendes funktioniert nicht:
// rtc.time(jahr, monat, tag, stunde, minute, sekunde, Time::kTuesday);
   
rtc.halt(false); // RTC wieder laufen lassen
halten = false; // ein Merker für den Zustand, unkritisch
Serial.println(jahr);
Serial.println(monat);
Serial.println(tag);
Serial.println(stunde);
Serial.println(minute);
Serial.println(sekunde);
Serial.println(wochentag);


Sketch (in .ino umbenennen)
RTC_V00.txt
(4.5 KiB) 8-mal heruntergeladen


Das dürfte wieder auf ein C++-Verständnisproblem hinauslaufen :oops: - Was mache ich falsch?
sysconsol
 
Beiträge: 1320
Registriert: Fr 8. Jul 2016, 17:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon Anse » Di 13. Mär 2018, 16:50

Funktioniert die Wandlung von Day String zu int?
Warum kann man den Tag nicht auch einfach mit einer Zahl setzen?
Anse
 
Beiträge: 1118
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl

Re: Der AVR-/ARDUINO-Faden

Beitragvon sysconsol » Di 13. Mär 2018, 18:31

Eben nicht.
Wenn ich den Tag als String einsetze, dann funktioniert es ja nicht mehr.

Oder verstehe ich deine Frage falsch?


Warum kann man den Tag nicht auch einfach mit einer Zahl setzen?

Du meinst, die Time-Funktion nicht ein enum erwarten lassen, sondern ein uint8_t?
Muss ich mal probieren.

Edit 18:11: Die Ausgabe funktionier schon, nur die Eingabe (setzen) funktioniert nicht mehr. Muss mir etwas mehr Verständnis besorgen.
sysconsol
 
Beiträge: 1320
Registriert: Fr 8. Jul 2016, 17:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon Anse » Di 13. Mär 2018, 19:42

sysconsol hat geschrieben:Du meinst, die Time-Funktion nicht ein enum erwarten lassen, sondern ein uint8_t?
Muss ich mal probieren.

In den String
Code: Alles auswählen
set20180313090100 2 \n
Statt Tuesday einfach eine 2 einfügen wie gezeigt, natürlich ohne Leerzeichen. Dann wie der Rest auslesen und umwandeln.

Alternativ kannst Du auch eine eigenen Funktion schreiben die aus "Tuesday" eine 2 macht und mit den anderen Tagen natürlich auch.
Geht auch mit Ersetzen im String.

Ich hätte das ganze mehr in dem Format gemacht:
Code: Alles auswählen
SetDate: 13.3.2018
SetWeekDay: 2
SetTime: 18:45:00

Vorteil:
-einzelne Datensätze können getrennt geschrieben werden. Z.B. wenn man nur die Zeit ändern will.
-Schön übersichtlich
-Leicht zu implementieren aber nur wenn es um noch mehr ähnliche Datensätze gibt damit es sich lohnt.

Beim Interpretieren wird nach den jeweiligen Schlüsselwörtern gesucht. Die Schlüsselwörter geben dann auch gleich an wie der folgende Stringabschnitt zu verstehen ist. Die Trennzeichen sind auch hilfreich beim interpretieren.
Nur mal so als Anregung.
Anse
 
Beiträge: 1118
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl

Re: Der AVR-/ARDUINO-Faden

Beitragvon sysconsol » Di 13. Mär 2018, 21:02

So einfach (statt Tagesnamen die Ziffer schreiben) geht das nicht.
Da müsste man irgendwie umwandeln, was ich aber nicht hinbekommen habe.

Ich habe jetzt die Bibliothek abgeändert.
Damit funktioniert das ohne die Tage beim Namen zu kennen.
Die Umwandelei ist mir persönlich zu verkompliziert worden.
Wenn ich das Chaos bereinigt habe, kann ich das gerne hier einstellen.

Die Formatierung der Ausgabe (Reihenfolge von Jahr, Monat,...) ist ein geringeres Problem und bereits gelöst.

Danke!
sysconsol
 
Beiträge: 1320
Registriert: Fr 8. Jul 2016, 17:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon sysconsol » Mi 14. Mär 2018, 09:13

Hier die modifizierte Bibliothek.
Im Beispiel-Ordner ist die Sketch zum Setzen der Zeit enhalten.

(ich hoffe, ich verstoße mit dem Einstellen nicht gegen irgendwelche Rechte)
Dateianhänge
arduino-ds1302-wo-dayname.zip
(151.71 KiB) 10-mal heruntergeladen
sysconsol
 
Beiträge: 1320
Registriert: Fr 8. Jul 2016, 17:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon Sir_Death » Mo 21. Mai 2018, 00:06

Jungs, ich brauch mal eure Hilfe - meine C-Kenntnisse sind schon seit 20 Jahren verrostet.

Gegeben: 2 Stück 3D-Drucker und eine Käsefräse, alle 3 mit Arduino Mega 2560 und RAMPS.
Unterschied: der USB-Chip 1 x der 16U2 und 2 x der CH340

Plan: Es soll eine Handsteuerung für die 3 Geräte her, die ich einfach anstecken (bzw. zwischen PC und Maschinensteuerung rein stecke)
Lösung: Noch ein Arduino Mega mit dem USB-Host-Shield.
Kommunikation mit allen 3en klappt schon mal, aber: es müssen unterschiedliche Treiber für den 16U2 und die CH340 geladen werden.
Nachdem ich die Handsteuerung einfach umstecken können will, fällt jedes mal neu compilieren aus.

Frage: Kann mir irgendjemand helfen, diesen Sourcecode so umzustricken, dass der Arduino beim Start entscheiden kann, welchen Treiber er lädt? - gerne spendiere ich einen Schalter an einem Eingang, mit dem ich den gewünschten Treiber signalisiere.
Hauptproblem: Die Programmierer der beiden Libraries (cdcacm.h und cdc_ch34x.h) haben teilweise die gleichen Variablennamen verwendet - spießt sich also auch schon mal dort.

Library: https://github.com/felis/USB_Host_Shield_2.0
Zusätzlich sind noch die beiden angehängten Dateien für den CH340 notwendig (habe ich in einem japanischen Forum gefunden - Google Translate macht es lesbar: http://www.suke-blog.com/arduino_usb_ho ... ith_ch340/


Code: Alles auswählen
// General definitions
#include <SPI.h>
uint16_t rcvd = 0;
byte data = 0;
byte i = 0;
byte buf[64];

// Arduino with 16U2 Interface-Chip
#include <cdcacm.h>

class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(ACM *pacm) {
    LINE_CODING  lc;
    lc.dwDTERate  = 250000;
    lc.bCharFormat  = 0;
    lc.bParityType  = 0;
    lc.bDataBits  = 8;
    pacm->SetLineCoding(&lc);
  }
};

USB           Usb;
MyAsyncOper   AsyncOper;
ACM           Acm(&Usb, &AsyncOper);

//Arduino with CH340 Interface-Chip
/*#include <cdc_ch34x.h>
 
class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(CH34X *pch34x) {
    LINE_CODING lc;
    lc.dwDTERate = 250000;
    lc.bCharFormat = 0;
    lc.bParityType = 0;
    lc.bDataBits = 8;
    lc.bFlowControl = 0;
    pch34x->SetLineCoding(&lc);
  }
};

USB         Usb;
MyAsyncOper AsyncOper;
CH34X       Acm(&Usb, &AsyncOper);*/

void setup()
{
  Serial.begin(250000);
  Usb.Init();
}

void loop()
{
  Usb.Task();

  // Arduino with 16U2 Interface-Chip
  rcvd = 64;
  //Arduino with CH340 Interface-Chip
  //rcvd = 32;

  if( Acm.isReady()) {
    if(Serial.available()) {
      data= Serial.read();
      Acm.SndData(1, &data);
    }
    Acm.RcvData(&rcvd, buf);
    if( rcvd ) for(i=0; i < rcvd; i++ ) Serial.print((char)buf[i]);
  }
}


Ich wäre für Hilfe sehr dankbar, denn das ist jedenfalls jenseits meiner Grenzen. - Bin froh, dass ich den Sourcecode so weit vereinfachen konnte.
Dateianhänge
cdc_ch34x.h
(3.83 KiB) 4-mal heruntergeladen
cdc_ch34x.cpp
(10.09 KiB) 3-mal heruntergeladen
Sir_Death
 
Beiträge: 1524
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitragvon gafu » Mi 23. Mai 2018, 22:24

Ich hab mal eine Frage:

Ich hab eine steuerung mit einem Atmega2560 prozessor.
Der hat ja 1000 beinchen, und eben auch welche, die beim "arduino mega" nicht auf buchsenleisten herausgeführt sind, und deshalb beim pin-mapping auch keine nummer in den üblichen übersichten haben.
z.B. Pin 69 "Port J bit 6"

Wie steuere ich den denn an mit den üblichen mitteln in der arduino ide?
Benutzeravatar
gafu
 
Beiträge: 2937
Registriert: Mi 14. Aug 2013, 20:56
Wohnort: nahe Jena

Re: Der AVR-/ARDUINO-Faden

Beitragvon Sir_Death » Mi 23. Mai 2018, 22:27

Ich vermute mal, auf Fußpilzbasis (Assembler) wird es schon gehen, wenn du die Register direkt ansprichst - frag mich aber bloß nicht wie.

Auf meine Frage (1 weiter oben) gibt es scheinbar noch keine Antwort. Schade :-(
Sir_Death
 
Beiträge: 1524
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitragvon Anse » Mi 23. Mai 2018, 23:20

Sir_Death hat geschrieben:Auf meine Frage (1 weiter oben) gibt es scheinbar noch keine Antwort. Schade
Ich hab von dem arduino-C keine Plan aber vielleicht bring es Dir was:
Code: Alles auswählen
// General definitions
#include <SPI.h>
uint16_t rcvd = 0;
byte data = 0;
byte i = 0;
byte buf[64];

// Arduino with 16U2 Interface-Chip
#include <cdcacm.h>

class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(ACM *pacm) {
    LINE_CODING  lc;
    lc.dwDTERate  = 250000;
    lc.bCharFormat  = 0;
    lc.bParityType  = 0;
    lc.bDataBits  = 8;
    pacm->SetLineCoding(&lc);
  }
};

USB           Usb;
MyAsyncOper   AsyncOper;
ACM           Acm(&Usb, &AsyncOper);

//Arduino with CH340 Interface-Chip
/*#include <cdc_ch34x.h>
 
class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(CH34X *pch34x) {
    LINE_CODING lc;
    lc.dwDTERate = 250000;
    lc.bCharFormat = 0;
    lc.bParityType = 0;
    lc.bDataBits = 8;
    lc.bFlowControl = 0;
    pch34x->SetLineCoding(&lc);
  }
};

USB         Usb;
MyAsyncOper AsyncOper;
CH34X       Acm(&Usb, &AsyncOper);*/

void setup()
{
  Serial.begin(250000);
  Usb.Init();
 pinMode([Pin mit Schalter], INPUT);//Hier muss ein Pull-up zu Vcc und ein Schalter zu Gnd dran
}

void loop()
{
  Usb.Task();
if (LOW==DigitalReade([Pin mit Schalter]))
{
   // Arduino with 16U2 Interface-Chip
   rcvd = 64;
}
else
{
   //Arduino with CH340 Interface-Chip
   rcvd = 32;
}
 
 

  if( Acm.isReady()) {
    if(Serial.available()) {
      data= Serial.read();
      Acm.SndData(1, &data);
    }
    Acm.RcvData(&rcvd, buf);
    if( rcvd ) for(i=0; i < rcvd; i++ ) Serial.print((char)buf[i]);
  }
}
An einem Pin muss ein Schalter angeschlossen werden. Wie siehe Kommentar.

gafu hat geschrieben:Ich hab mal eine Frage:

Ich hab eine steuerung mit einem Atmega2560 prozessor.
Der hat ja 1000 beinchen, und eben auch welche, die beim "arduino mega" nicht auf buchsenleisten herausgeführt sind, und deshalb beim pin-mapping auch keine nummer in den üblichen übersichten haben.
z.B. Pin 69 "Port J bit 6"

Wie steuere ich den denn an mit den üblichen mitteln in der arduino ide?
Habs nicht geprüft aber da sie mit C verwand ist könnte das hier gehen:
Code: Alles auswählen
DDRJ|=(1<<6);//Vergleichbar mit PinMode();
PORTJ|=(1<<6);//Setzen
PORTJ&=~(1<<6);//Zurück setzen
Wenn die Konstanten DDRJ usw. nicht bekannt sein sollten müssen an ihrer Stelle die Adressen aus dem Dabla. verwendet werden.
Anse
 
Beiträge: 1118
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl

Re: Der AVR-/ARDUINO-Faden

Beitragvon Sir_Death » Mi 23. Mai 2018, 23:28

Servus Anse

Danke - aber das ist leider nicht des Rätsels Lösung - soweit komme ich zum Glück selbst.
Mein Problem ist, dass die beiden USB-Librarys für den CH340 und den 16U2 die selben public Variablen verwenden, und sich das deswegen beim compilieren beißt...
Und eine Library ändern, damit das geht, übersteigt noch bei weitem meine Fähigkeiten.

Ich versuche mehr oder weniger ein Plug and Play mit Autodetect zu programmieren, wo der Arduino selbst entscheidet, welchen Treiber er lädt.

Inzwischen habe ich (bei 3D-Drucker Firmware abgeschaut) zumindest geschafft, dass ich nicht jedes mal die gesamten Kommentarmarker ändern muss, sondern eine Config-Variable am Anfang, die den Compiler beeinflusst.

EDIT: Und externer Pullup braucht man nicht - einfach INPUT gegen INPUT_PULLUP tauschen ;)
Sir_Death
 
Beiträge: 1524
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitragvon berlinerbaer » Mi 23. Mai 2018, 23:30

Ohne jetzt den code gelesen zu haben, würde ich bei den sich überschneidenden Variablennamen einfach bei einem der beiden Treiber alle mit einem einheitlichen, kurzen Präfix versorgen, damit nix mehr durcheinander kommt.

Dann per Schalter zwischen beiden hin- und herschalten. Oder, noch simpler, die Buchsen in den zu steuernden Geräten direkt mit der passenden Brücke versehen, dann gehts ganz ohne Nachdenken und Platz genug wäre selbst bei einem DB9-Stecker...

Beim 2560 ist wohl wirklich Datenblattlektüre und eventuell auch inline-Assembler erforderlich.
berlinerbaer
 
Beiträge: 605
Registriert: Di 22. Aug 2017, 05:19
Wohnort: Berlin

Re: Der AVR-/ARDUINO-Faden

Beitragvon gafu » Mi 23. Mai 2018, 23:33

bei den üblichen 3d-drucker-firmwares gibts ne zweite serielle schnittstelle, z.b. für die steuerrung per bluetooth-modul.

Dort kannst du mit einem beliebigen geräts einfach per seriellem Uart Gcode-befehle reinsenden.
Du musst nur verhindern, das die handsteuerung etwas sendet während auf dem usb auch gcode reinkommt, weil das ineinanedrgewürfelt werden könnte (also auch innerhalb einer zeile)

weiss jetzt gerade nicht welchen entwicklungsstand die cnc-option von repetier firmware haben, aber das mal so als idee was man machen könnte.
Benutzeravatar
gafu
 
Beiträge: 2937
Registriert: Mi 14. Aug 2013, 20:56
Wohnort: nahe Jena

VorherigeNächste

Zurück zu Allgemeine Diskussion

Wer ist online?

Mitglieder in diesem Forum: AlexVR6, CH-Bastler, daruel, ESDKittel, masterstrike, radixdelta, scotty-utb, sukram und 25 Gäste

span