INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Reihenfolge der Funktionen in der IDE
13.03.2019, 00:09
Beitrag #1
Reihenfolge der Funktionen in der IDE
Moin!

Im Moment beschäftige ich mich mit dem USI (Universal Serial Interface) eines Attiny45.
Speziell geht es mir um die Funktionalität einer UART (TX).

Ich habe, auf Github, was gefunden. Es geht alles soweit.
Der Aufbau der Datei: erst die UART-Funktion und dann setup und loop.

Wenn ich nun, der besseren Übersicht, setup und loop nach vorne setze, hagelt es beim Übersetzen nur Fehler.

Warum ist das so?

Ich kann gerne den Code hier einstellen. Wollte es aber erstmal vermeiden, weil ca.: 6KB groß.

Gruss Bernd
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2019, 09:56
Beitrag #2
RE: Reihenfolge der Funktionen in der IDE
(13.03.2019 00:09)Bernd666 schrieb:  Moin!
.....

Ich kann gerne den Code hier einstellen. Wollte es aber erstmal vermeiden, weil ca.: 6KB groß.

Gruss Bernd

Moin,
ohne Code und den bitte in Code Tags "#" siehe Menüleiste vom hiesigen Editor können dir die Kollegen nicht helfen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2019, 09:59
Beitrag #3
RE: Reihenfolge der Funktionen in der IDE
Ohne Code nur als Vermutung: Die IDE versucht Deklarationen aller Funktionen am Anfang des Codes zu erzeugen. Das schafft sie aber nicht immer sauber.

Mögliche Abhilfen:
1. Selbst die Deklarationen erstellen
2. Funktionen vor ihrer Verwendung anordnen

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2019, 11:46
Beitrag #4
RE: Reihenfolge der Funktionen in der IDE
Moin!

Danke für die Antworten.

(13.03.2019 09:59)Tommy56 schrieb:  Ohne Code nur als Vermutung: Die IDE versucht Deklarationen aller Funktionen am Anfang des Codes zu erzeugen. Das schafft sie aber nicht immer sauber.

Das kann ich nach vollziehen. Das bedeutet aber auch, wenn die Ide Setup() erkennt, mit dem Suchen nach Deklarationen aufhört.
Kann man denn irgendwo sehen, was sie dazu gebaut hat?

Und nun kommt der Code:

Code:
/*  
Author: Mark Osborne, BecomingMaker.com
See accompanying post http://becomingmaker.com/

An example of USI Serial Send for ATtiny25/45/85.
Sends a text message every second.
  
  ATTiny85 Hookup
  RESET -|1 v 8|- Vcc
    PB3 -|2   7|- PB2/SCK
    PB4 -|3   6|- PB1/MISO/DO
    GND -|4 _ 5|- PB0/MOSI/SDA
ATTiny85 PB1/MISO/DO = Serial UART Tx -> connect to Rx of serial output device
*/

/* Supported combinations:
*   F_CPU 1000000   BAUDRATE 1200, 2400
*   F_CPU 8000000   BAUDRATE 9600, 19200
*   F_CPU 16000000  BAUDRATE 9600, 19200, 28800, 38400
*/

// Set your baud rate and number of stop bits here
#define BAUDRATE            9600
#define STOPBITS            1
//F_CPU defined by Arduino, e.g. 1000000, 8000000, 16000000
//#define F_CPU 8000000

// If bit width in cpu cycles is greater than 255 then  divide by 8 to fit in timer
// Calculate prescaler setting
#define CYCLES_PER_BIT       ( (F_CPU) / (BAUDRATE) )
#if (CYCLES_PER_BIT > 255)
#define DIVISOR             8
#define CLOCKSELECT         2
#else
#define DIVISOR             1
#define CLOCKSELECT         1
#endif
#define FULL_BIT_TICKS      ( (CYCLES_PER_BIT) / (DIVISOR) )

// Old timer values
#ifdef ARDUINO
volatile static uint8_t oldTCCR0A;
volatile static uint8_t oldTCCR0B;
volatile static uint8_t oldTCNT0;
#endif

// USISerial send state variable and accessors
enum USISERIAL_SEND_STATE { AVAILABLE, FIRST, SECOND };
static volatile enum USISERIAL_SEND_STATE usiserial_send_state = AVAILABLE;
static inline enum USISERIAL_SEND_STATE usiserial_send_get_state(void)
{
    return usiserial_send_state;
}
static inline void usiserial_send_set_state(enum USISERIAL_SEND_STATE state)
{
    usiserial_send_state=state;
}
bool usiserial_send_available()
{
    return usiserial_send_get_state()==AVAILABLE;
}

// Transmit data persistent between USI OVF interrupts
static volatile uint8_t usiserial_tx_data;
static inline uint8_t usiserial_get_tx_data(void)
{
    return usiserial_tx_data;
}
static inline void usiserial_set_tx_data(uint8_t tx_data)
{
    usiserial_tx_data = tx_data;
}

static uint8_t reverse_byte (uint8_t x) {
    x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
    x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
    x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
    return x;
}

void usiserial_send_byte(uint8_t data)
{
    while (usiserial_send_get_state() != AVAILABLE)
    {
        // Spin until we finish sending previous packet
    };
    usiserial_send_set_state(FIRST);
    usiserial_set_tx_data(reverse_byte(data));

    // Save current Arduino timer state
#ifdef ARDUINO    
    oldTCCR0B = TCCR0B;
    oldTCCR0A = TCCR0A;
    oldTCNT0 = TCNT0;
#endif

    // Configure Timer0
    TCCR0A = 2<<WGM00;                      // CTC mode
    TCCR0B = CLOCKSELECT;                   // Set prescaler to clk or clk /8
    GTCCR |= 1 << PSR0;                     // Reset prescaler
    OCR0A = FULL_BIT_TICKS;                 // Trigger every full bit width
    TCNT0 = 0;                              // Count up from 0

    // Configure USI to send high start bit and 7 bits of data
    USIDR = 0x00 |                            // Start bit (low)
        usiserial_get_tx_data() >> 1;         // followed by first 7 bits of serial data
    USICR  = (1<<USIOIE)|                     // Enable USI Counter OVF interrupt.
        (0<<USIWM1)|(1<<USIWM0)|              // Select three wire mode to ensure USI written to PB1
        (0<<USICS1)|(1<<USICS0)|(0<<USICLK);  // Select Timer0 Compare match as USI Clock source.
    DDRB  |= (1<<PB1);                        // Configure USI_DO as output.
    USISR = 1<<USIOIF |                       // Clear USI overflow interrupt flag
        (16 - 8);                             // and set USI counter to count 8 bits
}

// USI overflow interrupt indicates we have sent a buffer
ISR (USI_OVF_vect) {
    if (usiserial_send_get_state() == FIRST)
    {
        usiserial_send_set_state(SECOND);
        USIDR = usiserial_get_tx_data() << 7  // Send last 1 bit of data
            | 0x7F;                           // and stop bits (high)
        USISR = 1<<USIOIF |                   // Clear USI overflow interrupt flag
            (16 - (1 + (STOPBITS)));          // Set USI counter to send last data bit and stop bits
    }
    else
    {
        PORTB |= 1 << PB1;                    // Ensure output is high
        DDRB  |= (1<<PB1);                    // Configure USI_DO as output.
        USICR = 0;                            // Disable USI.
        USISR |= 1<<USIOIF;                   // clear interrupt flag

        //Restore old timer values for Arduino
#ifdef ARDUINO
        TCCR0A = oldTCCR0A;
        TCCR0B = oldTCCR0B;
        // Note Arduino millis() and micros() will lose the time it took us to send a byte
        // Approximately 1ms at 9600 baud
        TCNT0 = oldTCNT0;
#endif

        usiserial_send_set_state(AVAILABLE);
    }
}

void setup() {
    pinMode(1,HIGH);                // Configure USI_DO as output.
    digitalWrite(1,HIGH);           // Ensure serial output is high when idle
}

void loop() {
    char message[] = "USI Serial\r\n";
    uint8_t len = sizeof(message)-1;
    for (uint8_t i = 0; i<len; i++)
    {
        while (!usiserial_send_available())
        {
            // Wait for last send to complete
        }
        usiserial_send_byte(message[i]);
    }
    delay(1000);
}

Gruss Bernd
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2019, 11:49 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2019 12:03 von Bitklopfer.)
Beitrag #5
RE: Reihenfolge der Funktionen in der IDE
Tagchen,
also ich hatte bislang keine Probleme wenn ich meine Sketche in dieser Reihenfolge aufgebaut habe:

Variablen und defines etc.
Setup
Loop
Funktionen

lgbk

Nachtrag:
Mir scheint du hast vergessen die ISR = wohl die Interrupt-Service-Routine auch von wo aus aufzurufen....
Code:
ISR (USI_OVF_vect)
..also da fehlt was,.... wenn ich diese Routine auskommentiere dann bleibt meine IDE bei TCCR0B hängen weil ich keine Tinys installiert habe.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2019, 12:06
Beitrag #6
RE: Reihenfolge der Funktionen in der IDE
@Bitklopfer: Ich hatte es schon einige Male. Seitdem versuche ich immer, die Funktionen vor ihrer Verwendung zu schreiben.

@Bernd666: In den Einstellungen ausführliche Ausgabe beim Kompilieren einstellen
Ziemlich am Anfang (in den ersten 10 Zeilen) gibt es eine, in der steht

Code:
...DeinSketchName.ino.cpp

Das ist die cpp-Datei, die die IDE erstellt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2019, 12:11 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2019 12:39 von Bernd666.)
Beitrag #7
RE: Reihenfolge der Funktionen in der IDE
Moin!
Normalerweise nutze ich diese Reihenfolge

#include <irgendwas>

#define IRGEND 12

Und dann den Code
Als erste Funktion dann void main(void) und den Rest in eigenen Funktionen dahinter. Dabei ist es egal in welcher Reihenfolge die Blöcke stehen.

Eigentlich versuche ich nur die IDE zu verstehen...
Es ist ja schön das sie sich die fehlenden Sachen zusammen sucht, hilft aber nicht wirklich weiter wenn man es so macht wie ich es gemacht habe.
Einfach Setup() und Loop() nach vorn gesetzt.

Also bleibe ich bei meiner gewohnten Vorgehensweise. Hat auch den Vorteil das man sieht welcher Headerdateien genutzt werden.

Gruss Bernd

/Nachtrag

@Tommy56: Du meinst in dem preferences.txt ? Da ist so eine Zeile nicht vorhanden. Ich nutze die Version 1.88.

Gruss Bernd

@Bitklopfer: ich habe den Code stumpf von der Webseite in die Ide kopiert und übersetzt. Ohne Fehler
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.03.2019, 23:09
Beitrag #8
RE: Reihenfolge der Funktionen in der IDE
Moin!

Dank Tommy56's Hinweis auf die *.ino.cpp weiss ich nun wie die IDE vorgeht.

Danke für eure Mithilfe.

Gruss Bernd
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ändern der Reihenfolge eines "Lauflichtes" rebeldesigned 3 460 05.11.2018 12:07
Letzter Beitrag: rebeldesigned
  Funktionen mit der millis() Funktion Zis 3 1.157 16.05.2018 21:50
Letzter Beitrag: Tommy56
  Funktionen und deren Rückgabewerte, Verständnisproblem HarryS 6 1.314 07.02.2018 22:58
Letzter Beitrag: Tommy56
Question Relais in Reihenfolge ansteuern. Jonas Lindenblatt 32 4.606 27.12.2017 12:40
Letzter Beitrag: MiReu
  Übergabe von Arrays an Funktionen Marcel 4 1.612 31.10.2017 13:28
Letzter Beitrag: Tommy56
  Werden ungenutzte Funktionen weg optimiert? BennIY 1 787 03.10.2017 09:06
Letzter Beitrag: Tommy56
Lightbulb mehrere Funktionen mit Schalter mechastef 7 1.992 21.08.2017 22:34
Letzter Beitrag: SkobyMobil
  Taster für mehrere Funktionen matthias3579 5 2.482 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Funktionen zusammenfassen ferdi 4 2.811 01.12.2015 16:52
Letzter Beitrag: Hilgi
  Taster für zwei Funktionen nutzen - wie macht man das? Gelegenheitsbastler 2 1.698 22.07.2015 11:56
Letzter Beitrag: Scherheinz

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste