Raspberry Pico ya C++ ile Yazılımsal Reset Atmak

RP2040 RESET:
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/watchdog.h"

void setup() {
  pinMode(25, OUTPUT);


  digitalWrite(25, HIGH);
  delay(500);
  digitalWrite(25, LOW);
  delay(500);
}

void loop() {

  if (BOOTSEL) {
    watchdog_enable(1, 1);
  }

}

Dün @taydin abinin konuda bize verdiği "Watch Dog" ipucundan sonra datasheet'e bakmaya başladım datasheet içeriklerinin listelendiği ilk sayfa da şu kısmı gördüm "Interaction with Watchdog . 197" bu kısma bakarken karşıma "FRCE_ON" "FRCE_OFF" gibi bölümler çıktı bu bölümlerin içeriğine bakarken "VREG_AND_CHIP_RESET" bunu gördüm ve bunu google'de arattım https://raspberrypi.github.io/pico-sdk-doxygen/group__hardware__watchdog.html karşıma bu çıktı bu verilen örneği incelerken bu örnekte gelen kütüphanelerin bizim picoyu ideye kurarken geldiğini gördüm ve bu örneği incelemye düzenlemeye başladım bootsel butonu ile bir if oluşturup bu if ile sıra sıra bu watchdog komutlarını işledim ve en son watchdog_enable(100,1); resetlediğini ama biraz gecikmeli olduğunu gördüm içeriğini 1,1 yapınca anında restlendi.
 
dün saat 21:30'da resetlemeyi başardım ve bunu @taydin abi ile paylaşıp yanlışım olup olmadığını da sordum.
 
Öncelikle kestane balının diyarı zonguldaktan herkese selamlar :katil1:

Öncelikle dün bahsetmiştim Facebook da bir arkadaşın bulduğu çözüm çalışıyor.
Yalnız kodun sonuna eklenen delay(); fonksiyonunu hiç bir şekilde görmüyor.

C++:
#define AIRCR_Register (*((volatile uint32_t*)(PPB_BASE + 0x0ED0C)))
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(2000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(2000); 
AIRCR_Register = 0x5FA0004;
  delay(10000); (Çalışmıyor...);

}

BURADAN SONRASI HİÇ BİR ŞEKİLDE GOOGLE'A BAŞVURMADAN YAPIŞMIŞTIR.

Benim PDF den bakıp EXAMPLE'ı kopyalayarak ve derleyerek bulduğum çözüm;

watchdog enable:
#include "hardware/watchdog.h";  // Hardware Kütüphanesi (Sanırım bu çipin içinde bulunuyor.)

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(3000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(3000);

 // 1) WDT yi yapılandır
 // 2) WDT timeout'u minimum değer yap
 // 3) Sonsuz döngüye gir ve işlemcinin resetlenmesini bekle.

// Bu watchdog'un çalışıp - çalışmadığını kontrol ediyor.
if (watchdog_caused_reboot()) {
  printf("Rebooted by Watchdog!\n");
  Serial.println("Watchdog Çalışltı");
 } else {
 printf("Clean boot\n");
 Serial.println("Çalışmadı");
 }

 // 1- Watchdog yapılandırıldı.
 // 2- İlk argüman, milisaniye cinsinden resetleme zamanını ayarlıyor. 2.Maddenin karşılığı olarak 1 milisaniye ye ayarlandı.
 // 3- İkinci argüman, hata ayıklamada duraklamadır, bu, kod boyunca adım atarken watchdog'un duraklayacağı anlamına gelir.
 watchdog_enable(1, 1);

// Bu watchdog'u güncelliyor. Olmasa da watchdog çalışıyor. Ne kadar gerekli emin değilim.
 for (uint i = 0; i < 5; i++) {
 printf("Updating watchdog %d\n", i);
 Serial.println("Updating watchdog %d\n");
 watchdog_update();
 }

 // Bu 3.Maddemiz olan sonsuz döngü. (Burada watchdog'u güncellemeyin yazıyordu nedenini anlayamadım.)
 printf("Waiting to be rebooted by watchdog\n");
 Serial.println("Waiting to be rebooted by watchdog\n");
 while(1);
}

Bu da example bağlı kalmadan pdf DEN kendi kendime ürettiğim çözüm;
Buradaki Maksimum değer 0x7ffffff, yaklaşık 8,3 sn. (Bu değerin minimum karşılığını bulamadım.)
C++:
#include "hardware/watchdog.h"; // Hardware Kütüphanesi (Sanırım bu çipin içinde bulunuyor.)

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(3000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(3000);

 // 1) WDT yi yapılandır
 // 2) WDT timeout'u minimum değer yap
 // 3) Sonsuz döngüye gir ve işlemcinin resetlenmesini bekle.

  // Watchdog_reboot açıklamaları
  // 1- İlk değer Sıfır ise, standart bir önyükleme gerçekleştirilecektir, sıfır değilse, sıfırlamada atlanacak program sayacıdır.
  // 1.1- Bu, Şu demek; Eğer ilk değeri 2 girersek resetlerken 2 prgramı atlayacaktır. Buradaki "program" dan kasıt çevre birimi mi, yoksa yazılımsal birşey mi anlamadım.
  // 2- İkinci değer, ilk değer sıfır değilse, kullanılan yığın işaretçisi olacaktır.
  // 2.1- Bu da birinci parametrede belirtilen atlanacak programın hexadecimal adresi olsa gerek.
  // 3- Üçüncü değer başlangıç sayaç değeri. Maksimum değer 0x7ffffff, yaklaşık 8,3 sn. (Bu değerin minimum karşılığını bulamadım.)
  watchdog_reboot(0,0,0x7fffff);  // Yapılandırma ve 8.3 Saniye timeout
  while(1); //Sonsuz Döngü
}

ÖZETLE ŞU İKİ KOD AYNI İŞLEMİ YAPIP RESET ATIYOR.

watchdog enable:
#include "hardware/watchdog.h";

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
 watchdog_enable(10000, 1); //10sn sonra reset
 while(1); //Sonsuz döngü
}

watchdog reset:
#include "hardware/watchdog.h";

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
 
watchdog_reboot(0,0,0x7fffff);  // 8.3 Saniye timeout
  while(1); //Sonsuz Döngü
}

 
abi resetledikten sonra yazdığın hiçbir komut çalışamaz çünkü işlemci yeniden başlıyor orayı göremeden
 
dün saat 21:30'da resetlemeyi başardım ve bunu @taydin abi ile paylaşıp yanlışım olup olmadığını da sordum.
1- Google dan kopya çekmişsin
2- 3 Adımı tam açıklamamışsın. Sonsuz döngü nerede?
3- Hakeme önceden bilgi verip etkilemeye çalışmışsın :katil2:

@taydin hakem bekleniyor :D
 
abi sadece watch dog eneable yetiyor resetlemeye biraz uzak yol olmamıs mı bu
 
abi resetledikten sonra yazdığın hiçbir komut çalışamaz çünkü işlemci yeniden başlıyor orayı göremeden
Niye led belirttiğim saniyede yanıp sönüyor?
Ayrıca amaç sadece resetlemekti. Programa gömerken ona göre yapılandırılacak zaten.
 
1- Google dan kopya çekmişsin
2- 3 Adımı tam açıklamamışsın. Sonsuz döngü nerede?
3- Hakeme önceden bilgi verip etkilemeye çalışmışsın :katil2:

@taydin hakem bekleniyor :D
abi sonsuz döngüye ne gerek var ben butona basınca watch dogu devreye sokuyorum 1 milisaniye zamanı doluyor ben 1 milisaniye içinde tazeleme yapmadığım için resetliyor işte
 
void loop() {//loopa girdi
digitalWrite(LED_BUILTIN, HIGH); //ledi yaktı
delay(2000); // //bekledi
digitalWrite(LED_BUILTIN, LOW); ledi söndürdü
delay(2000); // bekledi
AIRCR_Register = 0x5FA0004; //yeniden başladı sonraki satıra geçemedi
delay(10000); (Çalışmıyor...);
 
abi sonsuz döngüye ne gerek var ben butona basınca watch dogu devreye sokuyorum 1 milisaniye zamanı doluyor ben 1 milisaniye içinde tazeleme yapmadığım için resetliyor işte
Kurallar belli;

1) WDT yi yapılandır
2) WDT timeout'u minimum değer yap
3) Sonsuz döngüye gir ve işlemcinin resetlenmesini bekle.
 
1- Google dan kopya çekmişsin
2- 3 Adımı tam açıklamamışsın. Sonsuz döngü nerede?
3- Hakeme önceden bilgi verip etkilemeye çalışmışsın :katil2:

@taydin hakem bekleniyor :D
abi mevzu sonsuz döngüyse while(1) eklerim oraya .
Abi sen benden çok kopya çekmişssin.
Hakem abimle dün akşam minik bir konuşmamız oldu abi etkileme falan yok
 
abi mevzu sonsuz döngüyse while(1) eklerim oraya .
Abi sen benden çok kopya çekmişssin.
Hakem abimle dün akşam minik bir konuşmamız oldu abi etkileme falan yok
Kopya çektiğimi nerden anladın?
Etiketleme konuyu daha sonra ziyaret edecekler için açıklamaydı ve pdf den alındı o etiketler. Netten bulmadım yani :D
 
ben hep en sade en anlaşılır şekli yazmaya çalışırım o yüzden while(1);'e gerek duymadım
 
bir facebook grubunda paylaşımını gördüm abi.
ahahahahahaha
Onların kendilerine hayrı yok yav. Kaç bin kişilik gruba yazdım, 1 kişi doğru cevap verdi o da watchdog değil. Yukarıda paylaştım zaten onuda.
Ve o konular Timur abi yarışma önermeden önce açılmıştı.

O değilde Timur abi pdf şart koşup yarışma önermese hayatta işim olmazdı pdf le. Belki hala google da resetleme arıyor olurdum şuan.
Bu gerçekten çok öğretici oldu. Ama malesef benim kafa kalın. Bir süre sonra unutuyorum. İnşallah sen bir daha unutmazsın. Bende sıkışınca sana sorarım :D
 
Hmm AIRCR registeri de güzel bir çözümmüş. Bu register RP2040 datasheet'inde belirtilmeyen bir register. Bu çözümü bulan adam doğrudan ARM Cortex M dokümanlarını okumuş :oops:

Onun dışında doğru metot watchdog_enable ile watchdog'u etkinleştirmek ve ondan sonra da sonsuz döngüye girmek. Sonsuz döngü önemli, çünkü resete kadar geçen sürede işlemcinin kesinlikle farklı birşey yapmasını istemezsin. Resete kadar o döngüde oyalansın istersin. Eğer reset zamanı uzunsa belki o sonsuz döngüde bir LED falan blink'lersin, ama önemli olan işlemcinin resete kadar kontrolsüz birşey yapmaması.
 
ahahahahahaha
Onların kendilerine hayrı yok yav. Kaç bin kişilik gruba yazdım, 1 kişi doğru cevap verdi o da watchdog değil. Yukarıda paylaştım zaten onuda.
Ve o konular Timur abi yarışma önermeden önce açılmıştı.

O değilde Timur abi pdf şart koşup yarışma önermese hayatta işim olmazdı pdf le. Belki hala google da resetleme arıyor olurdum şuan.
Bu gerçekten çok öğretici oldu. Ama malesef benim kafa kalın. Bir süre sonra unutuyorum. İnşallah sen bir daha unutmazsın. Bende sıkışınca sana sorarım :D
abi ben gördüğüm ismi unutmam o çözen adamın adı bilgehandı.
Ben not alıyorum abi yeni yeni öğrenirken akılda kalıcılığı çok olmuyor birşey ararken önce kendi arşivime bakarım daha önce benzer bişey yapıp yazmış mıyım diye yoksa google
 
@Gokrtl AIRCR metodunu kendin denedin mi? Çalışması lazım ama çalıştığını görürsen daha iyi olur.
 

Forum istatistikleri

Konular
5,904
Mesajlar
100,838
Üyeler
2,499
Son üye
nevermind

Son kaynaklar

Son profil mesajları

Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
Back
Top